J'obtiens rarement cette erreur lors d'un appel API.
java.lang.IllegalStateException: Fragment not attached to Activity
J'ai essayé de mettre le code à l'intérieur de la isAdded()
méthode pour vérifier si le fragment est actuellement ajouté à son activité, mais j'obtiens toujours rarement cette erreur. Je ne comprends pas pourquoi j'obtiens toujours cette erreur. Comment puis-je l'empêcher?
Son erreur d'affichage sur la ligne-
cameraInfo.setId(getResources().getString(R.string.camera_id));
Vous trouverez ci-dessous l'exemple d'appel d'API que je fais.
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
android
android-fragments
android-activity
android-volley
android-lifecycle
Développeur Android
la source
la source
Réponses:
Cette erreur se produit en raison de l'effet combiné de deux facteurs:
onResponse()
ouonError()
(qui fonctionne sur le thread principal) sans savoir si leActivity
est toujours au premier plan ou non. Si leActivity
est parti (l'utilisateur a navigué ailleurs),getActivity()
renvoie null.Response
est exprimé comme une classe interne anonyme, qui contient implicitement une référence forte à laActivity
classe externe . Cela entraîne une fuite de mémoire classique.Pour résoudre ce problème, vous devez toujours faire:
et aussi, utilisez
isAdded()
dans laonError()
méthode:la source
AsyncTask
s depuis unActivity
, il n'existe aucun moyen infaillible d'éviter les NPE. Il y a toujours une chance que l'utilisateur s'éloigne du courantActivity
pendant que l'un des threads fait quelque chose en arrière-plan, puis lorsque le thread se termine etonPostExecute()
ouonResponse()
est appelé, il n'y a pasActivity
. Tout ce que vous pouvez faire est de vérifier les références nulles à divers points de votre code, et ce n'est pas à l'épreuve des balles :)added
indicateur booléen et si l'Activity
instance actuelle l' estnull
ou non.Le cycle de vie des fragments est très complexe et plein de bugs, essayez d'ajouter:
la source
return mHost != null && mAdded;
- C'est ce que contient la méthode fragment.isAdded (). Je pensais que mHost est une activité si vous la tracez, mais il semble que mHost soit à l'intérieur de FragmentActivity. Alors, probablement, vous avez raison. Des ajouts?I Found Very Simple Solution isAdded () méthode qui est l'une des méthodes de fragment pour identifier que ce fragment actuel est attaché à son activité ou non.
nous pouvons utiliser ceci comme partout dans la classe de fragment comme:
la source
Exception: java.lang.IllegalStateException: Fragment
DeadlineListFragment {ad2ef970} non associé à l'activité
Catégorie: Cycle de vie
Description : Lors d'une opération fastidieuse dans le thread d'arrière-plan (par exemple, AsyncTask), un nouveau fragment a été créé entre-temps et a été détaché de l'activité avant la fin du thread d'arrière-plan. Le code dans le thread d'interface utilisateur (par exemple, onPostExecute) fait appel à un fragment détaché, lançant une telle exception.
Solution fixe:
Annuler le fil d'arrière-plan lors de la mise en pause ou de l'arrêt du fragment
Utilisez isAdded () pour vérifier si le fragment est attaché, puis pour getResources () à partir de l'activité.
la source
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
Voici la classe d'application
la source
Cette erreur peut se produire si vous instanciez un fragment qui ne peut pas être instancié d'une manière ou d'une autre:
Dans mon cas, j'ai rencontré ceci lorsque j'ai essayé d'utiliser:
la source
En utilisation Fragment
isAdded()
Il retournera vrai si le fragment est actuellement attaché à Activity.Si vous souhaitez vérifier dans l'activité
J'espère que cela aidera quelqu'un
la source
J'ai adopté l'approche suivante pour traiter ce problème. Création d'une nouvelle classe qui agit comme un wrapper pour des méthodes d'activité comme celle-ci
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. Dans le cas où l'activité
context
n'est pas,null
il renvoie la valeur de l'actif et dans le cas oùcontext
est nulle, elle 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 plantage avec élégance. Vous voudrez ajouter des journaux dans les cas où vous obtenez une instance d'activité comme nulle et essayez de résoudre ce problème, si possible.
la source
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'obtenir , ou si l'activité n'existe plus. utilisez le contexte dans fragment.onCreate et après la réponse de l'API, ce problème est généralement le cas
la source
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 m'en débarrasser.
la source
Ce problème se produit chaque fois que vous appelez un contexte qui n'est pas disponible ou nul lorsque vous l'appelez. Cela peut être une situation lorsque vous appelez le contexte du thread d'activité principal sur un thread d'arrière-plan ou le contexte du thread d'arrière-plan sur le thread d'activité principal.
Par exemple, j'ai mis à jour ma chaîne de préférence partagée comme suit.
Et appelé finish () juste après. Maintenant, ce qu'il fait, c'est que la validation s'exécute sur le thread principal et arrête toute autre validation Async si elle arrive jusqu'à ce qu'elle se termine. Son contexte est donc vivant jusqu'à ce que l'écriture soit terminée. Par conséquent, le contexte précédent est en direct, ce qui provoque l'erreur.
Assurez-vous donc de faire revérifier votre code s'il y a du code ayant ce problème de contexte.
la source