2016-10-17 9 views
0

地図ビューでApiをプルするスレッドによって車両lat-lntを更新する必要があるプロジェクトがあります。私はupdateThreadがアプリケーションがonStopまたはonPauseを起動するときにスリープし、OnResumeが起動したときに起動します。また、アプリのライフサイクルで決して死ぬことはありません。初めて、私はちょうどupdateingに下記(溶液1)を使用しよう:Androidアップデートのスレッドを制御する方法

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     while(true){ 
     //update-Vehicle-Looping 
     } 
    } 
}).start(); 

はしかし、テスト中に、私はアプリがonStopまたはonPauseになったときにスレッドが自動的に殺されていないことが判明、しかし、保証はありませんそれは殺されません、Androidはそれがスレッドが使用しているリソースが必要になるまで実行し続けます。これは大きなリソースコストをかけることはありませんが、スレッドを殺したリスクがあります。

だから、私は別の(Solution2)whickを使用して、スレッドのリフトサイクルを制御できます。

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 
mHandler = new Handler(thread.getLooper()); 
mHandler.post(UpdateRunable); 
Runable UpdateRunable=new Runnable() { 
    @Override 
    public void run() { 
     while(IsRun){ 
     //update-Vehicle-Looping 
     } 
    } 
}; 

アプリリフトサイクルで更新スレッドawakerまたは睡眠を制御するために使用IsRun;センス(溶液2)(溶液1)を改善します。スレッドで死亡したリスクを回避することはできません。

アプリのライフサイクルでアップデートスレッドを制御するための提案はありますか?

+0

「サービス」を使用します。 – earthw0rmjim

答えて

0

ロジックはサービス内で移動する必要があります。そのため、まずアクティビティのライフサイクルに依存しません。そうすることで、イベントを地図表示に送ることを止めることができます。 Serviceバインディングを使用してサービスからUIを制御する

0

uiを更新するときに、実行可能なインターフェイスを持つハンドラを使用する必要があります。 アクティビティライフサイクルの最期にいる間は、アプリがクラッシュするため、ハンドラにメッセージを投稿しないでください。

関連する問題