2010-11-23 15 views
1

私のアプリケーションでは、ランダム化された時間後に実行可能ファイルを実行するハンドラを使用するサービスがあります。プログラムはうまくいく - 数時間。私はアプリを再起動することができ、アプリの強制終了するとすぐに、さらに数時間後にハンドラが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行目はどこですか? –

答えて

0

私は非常に似た問題を抱えていました。これは特定の条件下でランナブルをインスタンス化するだけで、実際には特定の条件下で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のremovecallbackを呼び出す可能性があります。あなたがtryブロックに入れた場合、それでもremovecallbacksが失敗する可能性がありますが、ユーザーには影響しません。

これは8か月前に尋ねられましたが、私の答えは他の人に役立つかもしれないと思いました。 :) これは役立ちます。

関連する問題