访问片段后台任务中的资源通常会返回illegalStateException

时间:2016-04-20 13:25:20

标签: android android-fragments

我正在发送异步网络请求以获取评论和预告片。

如果存在评论和预告片,则将它们设置为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)

3 个答案:

答案 0 :(得分:5)

您的片段未附加到活动意味着:您的片段当时对用户不可见,因为您通过按钮创建了另一个后台线程的网络调用,然后您将backStack片段或从活动中删除它。因此,当响应onResponse方法时,其上下文不可用。

所以你应该使用:

Fragment.this.getResources().getString(R.string.message_no_reviews)); 

或创建一个布尔值是否在onCreate()和onDestroy()中附加了片段

答案 1 :(得分:1)

tvReviewAuthor.setText(getActivity().getResources().getString(R.string.message_no_reviews)); 这应该做的工作你需要Context Object来访问String Resources

答案 2 :(得分:0)

使用 onAttach()方法知道您的片段何时附加到活动并获取其中的上下文并使用它来调用此类其他方法

    @Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = context;
}

然后你可以这样做

tvReviewAuthor.setText(activity.getResources().getString(R.string.message_no_reviews));