java - 从静态方法使用 OkHttp 请求加载数据时出现问题

标签 java android request okhttp

我的 Android 视频游戏应用程序出现问题。当我从静态方法调用 OkHttp 来浏览游戏评论时,就会出现问题。 当 OkHttp 请求位于 Activity 中时,它工作正常,但是当我将其移动到另一个类以便在 Activity 中拥有更清晰的代码时,应用程序工作得很奇怪。 首先,当我单击按钮获取评论时,我得到空数据,但是当我再次单击时,我得到上一次点击的数据。如果我打开第二个游戏,我会收到第一个游戏的评论,如果我打开第三个游戏,我会收到第二个游戏的评论,依此类推。 我对应用程序中的所有 API 请求都遇到同样的问题。

来自奇怪行为的 Gif url: https://thumbs.gfycat.com/OilyHardtofindDutchsmoushond-size_restricted.gif

Request 类中静态方法的 fragment :

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;
    }
}

这是我在回收者 View 中显示评论时的 Activity :

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);
    }
}

最佳答案

您得到一个空值,因为您在进行 api 调用时存储了“reviews”的值。此时,该函数将为评论返回 null 值,因为它可能尚未从 api 获取结果。相反,您只需在 onResponse() 方法中获取结果时调用 Activity 的一个方法即可设置“reviews”的值。

关于java - 从静态方法使用 OkHttp 请求加载数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60958177/

相关文章:

java - 将 Java 代码逆向工程为序列图

java - Maven 无法定位持久单元

java - Gson无法序列化

android - 如何将额外内容从 Intent 传递到 onActivityResult() 方法?

android - 将 Joda Time 添加到 Android Studio

c# - 如何在 C# 中获取整个请求的 url?

java - 如何解决异常java.sql.SQLException : No suitable driver found?

java - 依赖于 bootRun 的 Gradle 任务

python - requests_oauth2 使用教程

java - 重试 HTTP 请求(Java 11 - HttpClient)