Description :
En enquêtant pendant un moment, je suis arrivé à trouver le code de la ligne suivante :
handler.removeCallbacksAndMessages(null);
Je l'ai essayé et ça n'a pas pu résoudre mon problème. Voici l'erreur que je reçois :
java.lang.IllegalStateException: Fragment fragment_languages{f33796} not attached to a context.
at androidx.fragment.app.Fragment.requireContext(Fragment.java:696)
at androidx.fragment.app.Fragment.getResources(Fragment.java:760)
at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages.fillRecycler4(fragment_languages.java:173)
at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages.access$200(fragment_languages.java:21)
at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages$3.run(fragment_languages.java:61)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6694)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
J'appelle trois gestionnaires qui chargent les éléments dans trois vues différentes du recycleur et à des moments différents (parce que, si je les charge sans attendre, l'application se bloque parce qu'elle utilise trop de mémoire ou quelque chose comme ça).
Problème :
Un utilisateur "troll" peut simplement entrer dans mon application, puis entrer dans ce fragment dans lequel j'ai mes 4 handlers et appuyer sur le bouton retour une fois qu'il est entré et cela fera planter mon application aussi. C'est pourquoi je veux arrêter les handlers (en appuyant sur le bouton retour).
Que puis-je faire pour réparer cette erreur ?
Ce que vous devez savoir :
Mon fragment avec les handlers est à l'intérieur d'une activité (bien sûr). Le bouton retour est dans l'activité (pas dans le fragment).
"Langages fragmentés" Code JAVA :
father p = new father();
fillRecycler1();
p.handler.postDelayed(new Runnable() {
@Override
public void run() {
fillRecycler2();
}
},1500);
p.handler.postDelayed(new Runnable() {
@Override
public void run() {
fillRecycler3();
}
},2500);
p.handler.postDelayed(new Runnable() {
@Override
public void run() {
fillRecycler4();
}
},3500);
Activité (avec bouton retour) Code :
@Override
public void onBackPressed(){
if(p.contador == 0){
Intent intent = new Intent(categorias.this, MainActivity.class);
finish();
startActivity(intent);
p.handler.removeCallbacksAndMessages(null);
p.contador++;
p.handler.postDelayed(new Runnable(){
@Override
public void run(){
p.contador = 0;
}
},500);
}
}
Modifier (code java de la classe du père) :
public class father{
public int contador = 0;
public String aux = null;
public Handler handler = new Handler();
public Window window;
}