Dans mon application, j'ai un service qui utilise un gestionnaire pour exécuter un runnable après une période de temps aléatoire. Le programme fonctionne bien - pour quelques heures. Tout d'un coup, le programme déclenchera une NullPointerException avec la trace suivante:Handler Lance NullPointerException après plusieurs heures
java.lang.NullPointerException
at com.martin.ontime.OnTimeService$2.run(OnTimeService.java:224)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
De plus, dès que la ferme de la force d'application, je peux redémarrer l'application et l'exception ne sera pas jeté pendant quelques heures . Code abrégé en ce qui concerne le gestionnaire est la suivante:
public class AppService extends Service{
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
INITIATE ALL THE GLOBAL VARIABLES
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
//Handler that times the processes
private Handler h = new Handler();
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EXECUTE ALL CREATE FUNCTIONS
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
@Override
public void onCreate(){
super.onCreate();
//Clear all timers
h.removeCallbacks(setTime);
h.removeCallbacks(setAuto);
//Set a timer to start the processes
h.postDelayed(setAuto, 0);
}
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EXECUTE THESE FUNCTIONS WHEN SERVICE IS STOPPED
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
@Override
public void onDestroy(){
//Clear all timers
h.removeCallbacks(setTime);
h.removeCallbacks(setAuto);
}
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
HANDLER RUNNABLE
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
//Runnable
private Runnable setAuto = new Runnable() {
public void run(){
//Create a random number generator
Random r = new Random();
//Determine a random amount of time until time is changed
long d = r.nextInt(5) * 60 * 1000;
//Wait
h.postDelayed(setTime, d);
}
};
//Runnable used to set a random allowance
private Runnable setTime = new Runnable() {
public void run(){
try {
//Create a random number generator
Random r = new Random();
//Determine a random amount of time until time is changed
long d = r.nextInt(30) * 60 * 1000 + 1800000;
//Wait
h.postDelayed(setAuto, d);
***TRY/CATCH SURROUNDS A DATA OUTPUT STREAM***
}
catch (IOException e){
e.printStackTrace();
}
}
};
/**XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
}
J'ai un autre programme qui semble aussi avoir ce problème dans son service. J'ai seulement copié le code qui concerne le gestionnaire et le runnable et est partagé par les deux programmes. J'espère que c'est assez d'informations pour régler ce problème. Si plus d'informations sont nécessaires, je vais certainement remplir quelques espaces. Ce serait une aide précieuse pour ceux-ci et mes futures applications!
Où est la ligne 224 de OnTimeService.java? –