2012-05-03 7 views
1

私のアプリケーションは、Executorを使用してタスクを実行するスレッドを作成します。Androidスレッド - 別のスレッドからスレッドを実行し、ハンドラメッセージを待っています

私は必要に応じてメインスレッドにビットマップをロードして返します。

ビットマップがローカルに見つからない場合は、別のスレッドを使用してファイルをダウンロードします。

すべてのスレッドは、ハンドラが(それがハンドラにメッセージを送信することにより、別のスレッドに話をする必要がある場合には)そのスレッドから作成することができることを確実にするためにルーパーを作成

public class LooperThread extends Thread 
{ 
    @Override 
    public void run() 
    { 
     Looper.prepare(); 
     super.run(); 
     Looper.loop(); 
    } 
} 

メインスレッドは、Thread-1尋ねますビットマップを取得します。ビットマップが存在する場合、それはメインスレッドに正常に返されます。ビットマップが存在しない場合、スレッド1はスレッド2にダウンロードを要求する。 HandlerはThread-1で作成されるので、Thread-2はダウンロードが完了したときにThread-1にそれを伝えることができます。

問題は、ダウンロードが完了する前にスレッド1が実行を完了して終了するため、スレッド2がハンドラを介してメッセージを送信するときにメッセージを処理するものがないことです。

final RequestHandler handler = new RequestHandler() 
{ 
    @Override 
    protected void onComplete(Object response) 
    { 
     //This never happens as Thead-1 is already finished when download is complete 
     DownloadCompleteData data = (DownloadCompleteData)response; 

     onDownloadComplete(data.success, data.downloadId, data.filePath); 
    } 
}; 

myExecutor.execute(new Runnable() 
{ 
    public void run() 
    { 
     //blocking download call 
     DownloadCompleteData data = download(downloadRequest); 

     //Thread-2 now sends message back to Thread-1 
     handler.sendMessage(handler.obtainMessage(COMPLETE, data)); 
    } 
}); 

私はそれが生き続ける、それが中断されるまで、メッセージの処理を続けることができるようにスレッド-1で無限ループを実行する必要があると思うが、私はこれを正しく動くかどうかはわかりません。

誰でも正しい方法を知っていますか?

+0

Thread-1はどのように停止しますか?あなたがそうするように言わない限り、ループは止まらない。 – zapl

+0

スレッドがrun()メソッドを終了すると、スレッドはメッセージループでメッセージを処理しなくなると想定しました。私は明示的にスレッドを停止しないか、ルーパースレッドはExecutorsによって管理されます。メッセージループがまだ実行されている場合、実際の質問は、スレッド2から送信されたメッセージがスレッド1によって受信されないのはなぜですか? – JeffG

+0

'Looper.loop()'は無限ループです。内部メッセージキューからのメッセージは、そのループで処理されます。だからあなたはメッセージが届くのを待つことができません(自分で待つので)。それがあなたのことなのかどうかはわかりません。また、[HandlerThread](http://developer.android.com/reference/android/os/HandlerThread.html)を見てください - 彼らはルーパーロジックを既に実装しているので、そうする必要はありません。 – zapl

答えて

0

私はあなたがこのようにそれをしたいかどうかわからないですが、あなたはこれを教えてくれ、その後、ビットマップをダウンロードする2番目のスレッドを開始しますスレッド-1

if(bitmapIsntFound) 
{ 
    Thread-2.start(); 
    try 
    { 
     Thread-1.wait(); 
    } 

    catch(InterruptedException e) 
    { 
    System.out.println("Thread-1 
    } 

} 

にこのようなコードを試すことができます秒が実行されている間に待機する最初のスレッド。 2回目のダウンロードが終了したら、Thread-1.notify()を呼び出してThread-1を再起動します。

スレッド1の中間ストリームを一時停止したため、try {} catch(){}ステートメントを過ぎていないので、スレッド1が再開したときにダウンロードが保証されます。スレッド。

関連する問題