I am making an asynchronous network request to fetch reviews and trailers.
If the reviews and trailers are present then they are set as TextView texts. If there are no reviews present then I am setting the textview test as "No reviews"(message_no_reviews) which is a predefined string variable in strings.xml file.
Now in order to display that text when no reviews are available I am fetching that using
getResources().getString(R.string.message_no_reviews)
The problem is that call to getResources().getString(R.string.message_no_reviews) returns java.lang.IllegalStateException: Fragment MovieDetailFragment{1fdfd76} not attached to Activity many times whereas call to getResources().getString(R.string.api_key) does not cause any Exception.
Following is the code snippet.
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) {
        }
    });
}
Any thoughts on why this might be happening?
below is the 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)
                Your fragment is not attached to activity means:your fragment is not visible to user at that time since you made a network call from a button it create a another background thread and then you either backStack fragment or remove it from activity . So when response comes to onResponse method its context not available.
So You should use:
Fragment.this.getResources().getString(R.string.message_no_reviews)); 
or create a boolean whether fragment is attached or not in onCreate() and onDestroy()
tvReviewAuthor.setText(getActivity().getResources().getString(R.string.message_no_reviews));
This should do the work You need Context Object to access String Resources
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With