2012-01-03 12 views
1

自分のアクティビティでワーカースレッドを実行しています。アクティビティを終了するとき(onPause()など)、このスレッドにメッセージを送信しています。何か問題が起きない限り、すぐに(ミリ秒後に)終了する必要があります。 通常、onPause()でjoin()を使用しますが、この場合、このスレッドはシャットダウンシーケンスを実行するためにUIスレッドを使用する必要があります(アクセサリファイル記述子を閉じることは、 )。 UIスレッドをブロックしようとすると、デッドロックが発生します。私は何とかスレッドが終了するまで、アプリケーションの終了を延期するソリューションを探しています。 おそらく、このような場合に終了を中止することができれば、後でfinish()を手動で呼び出すことができますが、この(中止)を実行できるかどうかはわかりません。Androidアクティビティをブロックしてクリーンアップが終了するまでブロックします。

スレッドが最終的にクリーンアップと終了を完了すると仮定すると、非常に安全でないように見えます。

答えて

1

あなたが言ったように、UIスレッドはバックグラウンドスレッドが無期限に停止するのを待つことはできません。

以下のことができます。

1))(onPauseでスレッドを中断します。(あなたはクリーンアップ中にしたい場合、これは任意の情報を保持されません)

2)あなたには、いくつかの情報を保持し、クリーンな終了を実行したい場合は、あなたが開始することができますonPause()内のAndroiodサービスを使用して、そこのクリーンアップを行います。 EX(適時スレッドintheブーリアンフラグをチェック):擬似例

void run(){ 
while(true){ 
    if(bExit){ 
    doCleanupWork(); 
    } 
    //Do work 
    doWork(); 

    } 
} 

void doCleanupWork(){ 
startCleanupService(); 
} 

void onPause(){ 
bExit = true; 
} 

編集

3)ActivityクラスのonBackPressed()をオーバーライドし、それはdirectly.StartにAsyncTaskを終了しないようにdoInBackground()でクリーンアップ呼び出しが発生している間に処理を示すダイアログを表示します。クリーンアップがハングアップする可能性がある場合は、コードを再チェックし、必要に応じてタイムアウト後にスレッドを中断する必要があります。

+0

アプリケーションの終了後にクリーンアップを実行することは問題ではありません。問題は、クリーンアップが完了するまでアプリケーション終了を延期することです。 – Ytai

+0

私の編集内容を確認してください。 –

+0

について(3):onBackPressed()は、アプリケーションが終了する唯一の状況ではありません。すべての可能な出口経路をカバーしようとする試みは、非常に信頼性が低く、持ち運びができず、将来的には不可能である。 AsyncTaskについては、これはまったく必要ありません。通常、クリーンアップにはミリ秒かかります。私はちょうどそれがハングアップし、アプリケーションが前の実行を完全にクリーンアップする前に再起動しないことを確認するチャンスをキャッチしたい。 – Ytai

0

UIスレッドでハンドラを宣言します。もう一方のスレッドが終了すると、もう一方のスレッドから(空の)メッセージをそのハンドラに送信すると、UIスレッドでhandleMessageメソッドが実行されます。 handleMessageで最終的なUIクリーンアップを行います。

+0

これは 'onPause()'または 'onStop()'メッセージがすでに処理された後に発生するので、アプリケーションは既に終了していますか?私が達成しようとしているのは、スレッドが終了し、 'join()'のUIスレッドをブロックすることなく、アプリケーションの終了を遅らせることです(スレッドのクリーンアップの一環としてUIスレッドで作業を行うため、デッドロックを引き起こす)。 – Ytai

+0

hmmmm - 単にスレッドをonStopからシャットダウンするように伝えるのは快適だと感じています...シャットダウンを中止する方法はないと思いますので、スレッドがシャットダウンすることをスレッドに知らせるだけです手順。スレッドが完全にクリーンアップできないことが懸念されますか?必要な処理を行う時間が与えられている必要があります(つまり、UIスレッドが完了した直後にワーカースレッドは強制終了されません)。 – elijah

+0

私はクリーンアップの問題を捕まえることに懸念しています。私は周りに横たわっているスレッドを持つよりANRを取得することを好む...また、私は、アプリケーションが正常に終了する前に再起動されないことを確認したい。アプリケーションが停止/直ちに再起動され、問題を引き起こす可能性がある多くの状況があります。 – Ytai

関連する問題