2010-11-23 3 views
1

In meiner Anwendung habe ich einen Dienst, der einen Handler verwendet, um eine Runnable nach einer zufälligen Zeit auszuführen. Das Programm funktioniert gut - für ein paar Stunden.Handler Throwing NullPointerException nach mehreren Stunden

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) 

Zusätzlich, sobald die App Kraft schließt, kann ich starten Sie die App und die Ausnahme nicht für ein paar Stunden geworfen werden: das Programm wird eine Nullpointer mit der folgenden Spur wirft ganz plötzlich, . Abgekürzter Code in Bezug auf den Handler ist wie folgt:

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

Ich habe ein anderes Programm, das scheint auch dieses Problem in seinem Dienst zu haben. Ich habe nur den Code kopiert, der den Handler und das Runnable betrifft und von beiden Programmen geteilt wird. Ich hoffe, das sind genug Informationen, um dieses Problem zu lösen. Wenn mehr Informationen benötigt werden, werde ich sicher einige Lücken füllen. Es wäre eine große Hilfe für diese und meine zukünftigen Apps!

+1

Wo ist die Zeile 224 von OnTimeService.java? –

Antwort

0

Ich hatte ein sehr ähnliches Problem, weil ich die Runnables nur unter bestimmten Bedingungen instanziierte und auch nur unter bestimmten Bedingungen den postDelayed ausführte. Für Beispiel

if (conditions){ 
    myRunnable = new Runnable(){ 
    @Override 
    public void run(){ 
    } 
    } 
myHandler.postDelayed(myRunnable, 1000*60*1); 
} 
@Override 
public void onDestroy(){ 
myHandler.removeCallbacks 
} 

Um dies zu gewährleisten, könnte eine Kraft schließt nicht dazu führen, ich es

@Override 
public void onDestroy(){ 
try { 
if (conditions) 
myHandler.removeCallbacks; 
} catch (Exception e){//do nothing 
} 

Jetzt

geändert, wenn aus Versehen meiner Rückrufe entfernen fälschlicherweise genannt wird, wird die Ausnahme gefangen und es zwingt nicht nah.

Möglicherweise wurde ein postDelayed gelegentlich nicht ausgeführt, weil bestimmte Bedingungen nicht erfüllt wurden, oder bevor ein postDelayed gestartet wurde, hat das System den Dienst möglicherweise zerstört, wodurch die removecallbacks im Ondestroy aufgerufen wurden. Also, wenn Sie es in einen try-Block, dann, während die removecallbacks immer noch scheitern, wird es nicht Auswirkungen auf den Benutzer

Ich weiß, das wurde vor 8 Monaten gefragt, aber ich dachte, meine Antwort könnte jemand anderen helfen. :) Hoffe, das hilft.

Verwandte Themen