Je sais qu'il existe de nombreuses causes différentes pour NPE
mais la mienne est légèrement bizarre (du moins pour moi).
J'ai donc converti mon Activities
en Fragments
avec succès, mais mon problème semble provenir de la fonction qui affiche la date. Lorsque l'application est en cours d'exécution, tout fonctionne très bien. Mais dès que vous appuyez sur le bouton de retour. La force de l'application se ferme, puis dans le journal, il est indiqué que je reçois NullPointerException
à la ligne 102. Donc, en regardant le code, j'ai fait des recherches à ce sujet, mais malheureusement je n'ai rien obtenu.
Il s'agit de la ligne d'où provient l'erreur lorsque vous appuyez sur le bouton de retour.
getActivity().runOnUiThread(new Runnable(){
J'ai également essayé de désactiver le bouton de retour (car je construis un lanceur et ce n'est pas nécessaire). Mais cela ne semble pas fonctionner.
Voici le code de la méthode/fonction d'affichage de la date entière.
// (Calendar) Date function - Displays dateview on Card
final boolean keepRunning1 = true;
Thread thread_two = new Thread(){
@Override
public void run(){
while(keepRunning1){
// Make the thread wait half a second. If you want...
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
}
};
thread_two.start();
Merci pour votre temps, j'espère que vous pourrez faire la lumière sur ce que je fais mal.
Logcat -
05-23 21:17:33.216: E/AndroidRuntime(6906): Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v4.app.FragmentActivity.runOnUiThread(Java.lang.Runnable)' on a null object reference
05-23 21:17:33.216: E/AndroidRuntime(6906): at com.activelauncher.fragments.UtilsFragment$2.run(UtilsFragment.Java:102)
Je suis presque sûr que cela est causé lorsque le thread a terminé son travail, mais l'activité n'est plus visible.
Vous devez vérifier si l'appel getActivity()
retourne null, et ...
Pour appliquer des corrections sur votre code, regardez ceci:
// (Calendar) Date function - Displays dateview on Card
final boolean keepRunning1 = true;
Thread thread_two = new Thread(){
@Override
public void run(){
while(keepRunning1){
// Make the thread wait half a second. If you want...
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
// here you check the value of getActivity() and break up if needed
if(getActivity() == null)
return;
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
}
};thread_two.start();
Après avoir appuyé en arrière, votre thread d'arrière-plan est toujours en cours d'exécution. Au moment où le thread atteint le code getActivity().runOnUiThread()
, l'activité n'existe plus. Vérifiez si l'activité existe toujours comme ceci:
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
Mettre
if(getActivity() == null)
return;
avant getActivity().runOnUiThread(new Runnable(){
de cette façon, lorsque le bouton retour est fermé et que votre Thread
est toujours en cours d'exécution, il vérifiera si l'appelant Activity
existe toujours.
Si ce n'est pas le cas, ce sera return
.
La raison du NPE est que votre thread n'est pas lié au cycle de vie du fragment. Une fois le fragment détaché de son activité d'hébergement, getActivity()
renvoie null.
En tant que solution, envisagez de supprimer complètement le thread et utilisez simplement postDelayed()
sur un Handler
sur le thread d'interface utilisateur pour publier Runnable
s qui effectuent les mises à jour souhaitées après un certain délai.
Essaye celui-là
TextView date = (TextView) getView().findViewById(R.id.date);
cette date est nulle ou non cochée
if(date !=null){
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}