Проблема с загрузкой данных с помощью запроса OkHttp от метода stati c - PullRequest
0 голосов
/ 31 марта 2020

У меня проблема с моим Android приложением для видеоигр. Проблема возникает, когда я звоню из метода stati c в OkHttp, чтобы просмотреть обзоры игр. Когда запрос OkHttp был в действии, он работал нормально, но когда я переместил его в другой класс, чтобы иметь более чистый код в действии, приложение работает странно. Во-первых, когда я нажимаю кнопку, чтобы получить отзывы, я получаю нулевые данные, но когда я нажимаю снова, я получаю данные от предыдущего щелчка. Если я открываю вторую игру, я получаю отзывы от первой, если я открываю третью игру, я получаю отзывы от второй et c. У меня та же проблема для всех запросов API в приложении.

Gif URL из странного поведения: https://thumbs.gfycat.com/OilyHardtofindDutchsmoushond-size_restricted.gif

Фрагмент метода stati c в классе Запрос:

public class ReviewsRequests {

    private static ArrayList<Review> reviews = new ArrayList<>();
    private static Gson gson = new Gson();

    public static ArrayList<Review> getReviews(int gameId){
        OkHttpClient client = new OkHttpClient();

        String bodyString = "fields *; where game = " + gameId + ";";

        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody requestBody = RequestBody.create(bodyString, JSON);

        Request request = new Request.Builder()
                .url("https://api-v3.igdb.com/private/reviews")
                .addHeader("user-key", Helper.API_KEY)
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()) {
                    String jsonString = response.body().string();
                    Type listType = new TypeToken<ArrayList<Review>>(){}.getType();
                    reviews = gson.fromJson(jsonString, listType);
                }
            }
        });
        return reviews;
    }
}

И это действие, когда я показываю отзывы в представлении переработчика:

public class ReviewsActivity extends AppCompatActivity {
    ArrayList<Review> reviews = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reviews);
        Toolbar toolbar = findViewById(R.id.toolbar);
        RecyclerView recyclerView = findViewById(R.id.reviews_recycler_view);
        TextView noReviewsTV = findViewById(R.id.no_reviews_tv);

        int gameId = getIntent().getIntExtra("game_id", 1);
        String gameName = getIntent().getStringExtra("game_name");
        setSupportActionBar(toolbar);
        if(getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setTitle(gameName);
        }
        recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
        ReviewsAdapter adapter = new ReviewsAdapter(this);
        recyclerView.setAdapter(adapter);
        reviews = ReviewsRequests.getReviews(gameId);
        if (reviews.size() != 0) {
            adapter.setReviews(reviews);
            adapter.notifyDataSetChanged();
        } else noReviewsTV.setVisibility(View.VISIBLE);
    }
}

1 Ответ

0 голосов
/ 31 марта 2020

Вы получаете нулевое значение, потому что вы сохраняете значение «reviews» во время вызова API. В то время функция будет возвращать нулевое значение для обзоров, так как она могла не получить результат от API. Вместо этого вам просто нужно вызвать метод Activity, когда вы получите результаты в методе onResponse(), чтобы установить значение «reviews».

...