java.lang.IllegalStateException: Fragment not attached to Activity

前端 未结 12 1073
名媛妹妹
名媛妹妹 2020-11-28 02:28

I am rarely getting this error while making an API call.

java.lang.IllegalStateException: Fragment  not attached to Activity

I tried puttin

相关标签:
12条回答
  • 2020-11-28 02:48

    This error can happen if you are instantiating a fragment that somehow can't be instantiated:

    Fragment myFragment = MyFragment.NewInstance();
    
    
    public classs MyFragment extends Fragment {
      public void onCreate() {
       // Some error here, or anywhere inside the class is preventing it from being instantiated
      }
    }
    

    In my case, i have met this when i tried to use:

    private String loading = getString(R.string.loading);
    
    0 讨论(0)
  • 2020-11-28 02:48

    So the base idea is that you are running a UI operation on a fragment that is getting in the onDetach lifecycle.

    When this is happening the fragment is getting off the stack and losing the context of the Activity.

    So when you call UI related functions for example calling the progress spinner and you want to leave the fragment check if the Fragment is added to the stack, like this:

    if(isAdded){ progressBar.visibility=View.VISIBLE }

    0 讨论(0)
  • 2020-11-28 02:57

    In Fragment use isAdded() It will return true if the fragment is currently attached to Activity.

    If you want to check inside the Activity

     Fragment fragment = new MyFragment();
       if(fragment.getActivity()!=null)
          { // your code here}
          else{
           //do something
           }
    

    Hope it will help someone

    0 讨论(0)
  • 2020-11-28 03:00

    i may be late but may help someone ..... The best solution for this is to create a global application class instance and call it in the particular fragment where your activity is not being attached

    as like below

    icon = MyApplication.getInstance().getString(R.string.weather_thunder);
    

    Here is application class

    public class MyApplication extends Application {
    
        private static MyApplication mInstance;
        private RequestQueue mRequestQueue;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mInstance = this;
        }
    
        public static synchronized MyApplication getInstance() {
            return mInstance;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 03:00

    This issue occurs whenever you call a context which is unavailable or null when you call it. This can be a situation when you are calling main activity thread's context on a background thread or background thread's context on main activity thread.

    For instance , I updated my shared preference string like following.

    editor.putString("penname",penNameEditeText.getText().toString());
    editor.commit();
    finish();
    

    And called finish() right after it. Now what it does is that as commit runs on main thread and stops any other Async commits if coming until it finishes. So its context is alive until the write is completed. Hence previous context is live , causing the error to occur.

    So make sure to have your code rechecked if there is some code having this context issue.

    0 讨论(0)
  • 2020-11-28 03:01

    This error happens due to the combined effect of two factors:

    • The HTTP request, when complete, invokes either onResponse() or onError() (which work on the main thread) without knowing whether the Activity is still in the foreground or not. If the Activity is gone (the user navigated elsewhere), getActivity() returns null.
    • The Volley Response is expressed as an anonymous inner class, which implicitly holds a strong reference to the outer Activity class. This results in a classic memory leak.

    To solve this problem, you should always do:

    Activity activity = getActivity();
    if(activity != null){
    
        // etc ...
    
    }
    

    and also, use isAdded() in the onError() method as well:

    @Override
    public void onError(VolleyError error) {
    
        Activity activity = getActivity(); 
        if(activity != null && isAdded())
            mProgressDialog.setVisibility(View.GONE);
            if (error instanceof NoConnectionError) {
               String errormsg = getResources().getString(R.string.no_internet_error_msg);
               Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题