2017-01-05 3 views
1

私のアプリでは、MainActivityにハンドラがあります。このハンドラでは、ローカルデータベースからタイムスタンプ値を取得し、その値を現在のタイムスタンプに変更し、ローカルデータベースを更新します。このイベントは2分ごとに発生します。アンドロイドでアプリが殺された場合でも、ハンドラインスタンスが実行可能ファイルを実行する方法は?

私の問題は、私のアプリが殺されたときにローカルデータベースが更新されないようにすることです。しかし、ハンドラ内のコードが実行されても私のアプリケーションは殺され、ローカルデータベースのタイムスタンプ値が更新されます。だから、私は再び私のアプリが殺される前に、データベースに格納されている最後のタイムスタンプの値を私に与えることはありません。

私のアプリを殺すとハンドラを停止するには?ハンドラがどのように正確に動作するかを私に説明する価値があります。

ソースコード:

addEventHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
       mockSpeedEventHandler.postDelayed(this, realTimeEventFrequency * 60 * 1000); 
     } 
    }, 60000); 
+1

'onStop()'の中にこの 'handler.removeCallbacksAndMessages(null)'を持っていますか? – Raghunandan

+0

addEventHandler.removeCallbacksAndMessages(null);を呼び出して、onDestroy()でaddEventHandlerを停止しました。 – Madhan

答えて

1

私はあなたが2つのハンドラを使用している理由はわからないが、実行されるコードは、第二いずれかによってトリガされたと仮定した場合。解決策は、addEventHandlerとmockSpeedEventHandlerの両方を停止することです。

+0

よろしくお願いいたします。アプリが殺されたときにAndroidがハンドラを停止しなかった理由を説明してください。 – Madhan

+0

スケジューリング中のハンドラ実行が解放されず、ハンドラスレッド内で使用される参照も解放されないので、注意が必要です。このようにメモリリークを作成することができます – petrumo

+0

1つの最後の質問。私はこれを理解できません "各ハンドラのインスタンスは、単一のスレッドとそのスレッドのメッセージキューに関連付けられています。このステートメントでは、「スレッド」は、postDelayed()メソッドでハンドラに渡される「実行可能」パラメータを参照するか、ハンドラインスタンスを作成したメインスレッド(UI)スレッドを参照しますか? – Madhan

関連する問題