使用来自静态方法的 OkHttp 请求加载数据时出现问题
Problem with loading data with OkHttp request from static method
我的 Android 视频游戏应用程序有问题。当我从静态方法调用 OkHttp 浏览游戏评论时出现问题。
当 OkHttp 请求在 activity 中时它工作正常,但是当我将它移动到另一个 class 以便在 activity 中有更清晰的代码时,应用程序运行异常。
首先,当我点击按钮获取评论时,我得到的是空数据,但是当我再次点击时,我得到的是上一次点击的数据。如果我打开第二个游戏,我会得到第一个游戏的评论,如果我打开第三个游戏,我会得到第二个游戏的评论,依此类推。
我对应用程序中的所有 API 请求都有同样的问题。
Gif url 来自奇怪的行为:
https://thumbs.gfycat.com/OilyHardtofindDutchsmoushond-size_restricted.gif
请求中静态方法的片段class:
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;
}
}
这是 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" 的值。那时,该函数将为评论 return 空值,因为它可能没有从 api 获得结果。相反,当您在 onResponse()
方法中获得结果时,您只需调用 Activity 的方法来设置 "reviews".
的值
我的 Android 视频游戏应用程序有问题。当我从静态方法调用 OkHttp 浏览游戏评论时出现问题。 当 OkHttp 请求在 activity 中时它工作正常,但是当我将它移动到另一个 class 以便在 activity 中有更清晰的代码时,应用程序运行异常。 首先,当我点击按钮获取评论时,我得到的是空数据,但是当我再次点击时,我得到的是上一次点击的数据。如果我打开第二个游戏,我会得到第一个游戏的评论,如果我打开第三个游戏,我会得到第二个游戏的评论,依此类推。 我对应用程序中的所有 API 请求都有同样的问题。
Gif url 来自奇怪的行为: https://thumbs.gfycat.com/OilyHardtofindDutchsmoushond-size_restricted.gif
请求中静态方法的片段class:
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;
}
}
这是 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" 的值。那时,该函数将为评论 return 空值,因为它可能没有从 api 获得结果。相反,当您在 onResponse()
方法中获得结果时,您只需调用 Activity 的方法来设置 "reviews".