java.lang.IllegalStateException: fragment non attaché à l’activité

Je reçois rarement cette erreur lors d’un appel API.

java.lang.IllegalStateException: Fragment not attached to Activity 

J’ai essayé de mettre le code dans la méthode isAdded() pour vérifier si fragment est actuellement ajouté à son activité mais je isAdded() rarement cette erreur. Je n’arrive pas à comprendre pourquoi je reçois toujours cette erreur. Comment puis-je l’empêcher?

Son erreur d’affichage sur la ligne-

 cameraInfo.setId(getResources().getSsortingng(R.ssortingng.camera_id)); 

Vous trouverez ci-dessous un exemple d’appel api que je réalise.

 SAPI.getInfo(getActivity(), new APIResponseListener() { @Override public void onResponse(Object response) { cameraInfo = new SInfo(); if(isAdded()) { cameraInfo.setId(getResources().getSsortingng(R.ssortingng.camera_id)); cameraInfo.setName(getResources().getSsortingng(R.ssortingng.camera_name)); cameraInfo.setColor(getResources().getSsortingng(R.ssortingng.camera_color)); cameraInfo.setEnabled(true); } } @Override public void onError(VolleyError error) { mProgressDialog.setVisibility(View.GONE); if (error instanceof NoConnectionError) { Ssortingng errormsg = getResources().getSsortingng(R.ssortingng.no_internet_error_msg); Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show(); } } }); 

    Cette erreur est due à l’effet combiné de deux facteurs:

    • La requête HTTP, une fois terminée, appelle onResponse() ou onError() (qui fonctionne sur le thread principal) sans savoir si l’ Activity est toujours au premier plan ou non. Si l’ Activity disparu (l’utilisateur a navigué ailleurs), getActivity() renvoie null.
    • La Response Volley est exprimée comme une classe interne anonyme, qui contient implicitement une référence forte à la classe Activity externe. Cela se traduit par une fuite de mémoire classique.

    Pour résoudre ce problème, vous devez toujours faire:

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

    et aussi, utilisez également isAdded() dans la méthode onError() :

     @Override public void onError(VolleyError error) { Activity activity = getActivity(); if(activity != null && isAdded()) mProgressDialog.setVisibility(View.GONE); if (error instanceof NoConnectionError) { Ssortingng errormsg = getResources().getSsortingng(R.ssortingng.no_internet_error_msg); Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show(); } } } 

    Le cycle de vie des fragments est très complexe et plein de bogues, essayez d’append:

     Activity activity = getActivity(); if (isAdded() && activity != null) { ... } 

    J’ai trouvé Very Simple Solution isAdded () méthode qui est l’une des méthodes fragment pour identifier que ce fragment actuel est attaché à son activité ou non.

    nous pouvons l’utiliser comme partout dans la classe fragment comme:

     if(isAdded()) { // using this method, we can do whatever we want which will prevent **java.lang.IllegalStateException: Fragment not attached to Activity** exception. } 

    Je peux être en retard mais peut aider quelqu’un ….. La meilleure solution pour cela est de créer une instance de classe d’application globale et de l’appeler dans le fragment particulier où votre activité n’est pas attachée

    comme ci-dessous

     icon = MyApplication.getInstance().getSsortingng(R.ssortingng.weather_thunder); 

    Voici la classe d’application

     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; } } 

    Exception: java.lang.IllegalStateException: fragment

    DeadlineListFragment {ad2ef970} non attaché à Activity

    Catégorie: Cycle de vie

    Description : lors d’une opération fastidieuse dans un thread d’arrière-plan (par exemple, AsyncTask), un nouveau fragment a été créé entre-temps et a été détaché sur l’activité avant que le thread d’arrière-plan ne soit terminé. Le code dans le thread d’interface utilisateur (par exemple, onPostExecute) appelle un fragment détaché, en lançant une telle exception.

    Solution fixe:

    1. Annuler le thread d’arrière-plan lors de la pause ou de l’arrêt du fragment

    2. Utilisez isAdded () pour vérifier si le fragment est attaché puis getResources () à partir de l’activité.

    Cette erreur peut se produire si vous instanciez un fragment qui ne peut pas être instancié d’une manière ou d’une autre:

     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 } } 

    Dans mon cas, j’ai rencontré ceci quand j’ai essayé d’utiliser:

     private Ssortingng loading = getSsortingng(R.ssortingng.loading); 

    J’ai adopté l’approche suivante pour traiter ce problème. Création d’une nouvelle classe qui sert de wrapper pour les méthodes d’activité comme celle-ci

     public class ContextWrapper { public static Ssortingng getSsortingng(Activity activity, int resourceId, Ssortingng defaultValue) { if (activity != null) { return activity.getSsortingng(resourceId); } else { return defaultValue; } } //similar methods like getDrawable(), getResources() etc } 

    Maintenant, partout où j’ai besoin d’accéder à des ressources à partir de fragments ou d’activités, au lieu d’appeler directement la méthode, j’utilise cette classe. Si le context activité n’est pas null il renvoie la valeur de l’actif et, si le context est nul, il transmet une valeur par défaut (qui est également spécifiée par l’appelant de la fonction).

    Important Ce n’est pas une solution, c’est un moyen efficace de gérer ce problème avec succès. Vous souhaitez append des journaux dans les cas où vous obtenez une instance d’activité comme null et essayez de résoudre ce problème, si possible.

    Cela se produit lorsque le fragment n’a pas de contexte, donc la méthode getActivity () renvoie null. vérifiez si vous utilisez le contexte avant de l’avoir , ou si l’activité n’existe plus. utiliser le contexte dans fragment.onCreate et après la réponse api, généralement ce problème

    Parfois, cette exception est causée par un bogue dans l’implémentation de la bibliothèque de support. Récemment, j’ai dû passer de 26.1.0 à 25.4.0 pour le supprimer.

    si vous utilisez fragment

     private HomePageActivity homePageActivity; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_wish_list, container, false); initializeViews(); rowTextView.setBackgroundColor(homePageActivity.getResources().getColor(R.color.colorPrimary)); return mView; } private void initializeViews() { homePageActivity = (HomePageActivity) getActivity(); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof HomePageActivity) { homePageActivity = (HomePageActivity) context; } } 

    Ce problème se produit chaque fois que vous appelez un contexte indisponible ou nul lorsque vous l’appelez. Cela peut être une situation lorsque vous appelez le contexte du thread d’activité principale sur un thread d’arrière-plan ou un contexte de thread d’arrière-plan sur le thread d’activité principal.

    Par exemple, j’ai mis à jour ma chaîne de préférences partagée comme suit.

     editor.putSsortingng("penname",penNameEditeText.getText().toSsortingng()); editor.commit(); finish(); 

    Et appelé finish () juste après. Maintenant, ce qu’il fait, c’est que les commit s’exécutent sur le thread principal et arrête tout autre commit Async s’il arrive jusqu’à la fin. Donc, son contexte est vivant jusqu’à ce que l’écriture soit terminée. Par conséquent, le contexte précédent est actif, entraînant l’erreur.

    Veillez donc à ce que votre code soit revérifié si du code contient ce problème de contexte.

    Dans Fragment use isAdded() Il retournera true si le fragment est actuellement attaché à Activity.

    Si vous voulez vérifier à l’intérieur de l’activité

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

    J’espère que ça va aider quelqu’un