我正在进行一个异步网络请求,以获取评论和预告片。
如果存在评论和预告片,则将它们设置为TextView文本。如果没有评论,则我将textview测试设置为"no reviews"(message_no_reviews),这是strings.xml
文件中预定义的字符串变量。
现在,为了在没有评论可用的情况下显示该文本,我正在使用获取该文本
getResources().getString(R.string.message_no_reviews)
问题是对getResources().getString(R.string.message_no_reviews)
的调用多次返回java.lang.IllegalStateException: Fragment MovieDetailFragment{1fdfd76} not attached to Activity
,而对getResources().getString(R.string.api_key)
的调用不会导致任何异常。
以下是代码片段。
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getReviews();
getTrailers();
}
public void getReviews(){
Call<JsonObject> getReviewsCall = apiService.getReview(movie.getId(),getResources().getString(R.string.api_key));
getReviewsCall.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Response<JsonObject> response, Retrofit retrofit) {
if (response.body() != null) {
JsonArray reviews=(JsonArray) response.body().get("results");
System.out.println(reviews);
if(reviews.size()>0) {
tvReviewText.setText(((JsonObject) reviews.get(0)).get("content").getAsString());
tvReviewAuthor.setText(((JsonObject) reviews.get(0)).get("author").getAsString());
}
else{
tvReviewAuthor.setText(getResources().getString(R.string.message_no_reviews));
tvReviewText.setText("");
}
}
}
@Override
public void onFailure(Throwable t) {
}
});
}
你有没有想过为什么会发生这种事?
下面是logcat
FATAL EXCEPTION: main
Process: com.vipin.www.popularmovies, PID: 21580
java.lang.IllegalStateException: Fragment MovieDetailFragment{1fdfd76} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:636)
at com.vipin.www.popularmovies.MovieDetailFragment$2.onResponse(MovieDetailFragment.java:168)
at retrofit.ExecutorCallAdapterFactory$ExecutorCallback$1.run(ExecutorCallAdapterFactory.java:86)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
您的片段未附加到活动意味着:您的片段当时对用户不可见,因为您通过按钮进行了网络调用,它创建了另一个后台线程,然后您要么backStack片段,要么将其从活动中删除。因此,当响应到达onResponse方法时,其上下文不可用。
所以你应该使用:
Fragment.this.getResources().getString(R.string.message_no_reviews));
或者创建一个布尔值,无论片段是否附加在onCreate()和onDestroy()中
tvReviewAuthor.setText(getActivity().getResources().getString(R.string.message_no_reviews));
这应该可以完成您需要上下文对象来访问字符串资源
使用onAttach()方法来知道片段何时附加到活动,并获取其中的上下文,并使用它来调用其他方法,如
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = context;
}
然后你可以做这个
tvReviewAuthor.setText(activity.getResources().getString(R.string.message_no_reviews));