2010-11-23 47 views
1

在我的應用程序中,我有一個服務使用一個處理程序在一段隨機時間後執行一個runnable。該程序工作正常 - 幾個小時。一旦Handler在幾個小時後拋出NullPointerException

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) 

此外,由於應用強行關閉,我可以重新啓動應用程序和異常不會被拋出另一個幾個小時:突然的,程序將拋出一個NullPointerException異常與下面的跟蹤。關於處理程序的縮寫代碼如下:

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

我有另一個程序,它的服務中似乎也有這個問題。我只複製了涉及處理程序和可運行程序的代碼,並由兩個程序共享。我希望這是足夠的信息來解決這個問題。如果需要更多信息,我肯定會填寫一些空白。這將是這些和我未來的應用程序的很大幫助!

+1

OnTimeService.java的第224行在哪裏? – 2010-11-23 06:37:53

回答

0

我有一個非常類似的問題,因爲我只在某些條件下實例化runnables,並且也只在某些條件下實際運行postDelayed。 對於實例

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

爲了確保這會不會導致強制關閉,我把它改成

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

現在,如果錯誤地刪除我的回調被誤稱爲,異常被捕獲並不強迫關閉。

由於未滿足某些條件或postDelayed開始前,postDelayed有時可能不運行,系統可能已銷燬該服務,導致調用ondestroy中的removecallbacks。所以,如果你把它放在try塊中,那麼雖然removecallbacks可能仍然失敗,但不會對用戶造成影響

我知道這是8個月前問的,但我認爲我的答案可能有助於其他人。 :) 希望這會有所幫助。

相關問題