1

私のアプリケーションは Executor を使用してスレッドを作成し、タスクを実行します。

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

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

すべてのスレッドはルーパーを作成して、そのスレッドからハンドラーを作成できるようにします (ハンドラーにメッセージを送信して別のスレッドと通信する必要がある場合)

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

メイン スレッドは、Thread-1 にビットマップの取得を要求します。ビットマップが存在する場合は、メイン スレッドに正常に返されます。ビットマップが存在しない場合、スレッド 1 はスレッド 2 にダウンロードするように要求します。Thread-1 に Handler が作成されるため、Thread-2 はこれを使用して Thread-1 にダウンロードの完了を通知できます。

問題は、Thread-1 が実行を完了し、ダウンロードが完了する前に終了するため、Thread-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));
    }
});

Thread-1 で無限ループを実行して、中断されるまで生き続けてメッセージを処理し続ける必要があると思いますが、これを適切に行う方法がわかりません。

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

4

1 に答える 1

0

この方法でやりたいかどうかはわかりませんが、thread-1 でこれに似たコードを試すことができます

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

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

}

これにより、ビットマップをダウンロードするために 2 番目のスレッドが開始され、2 番目のスレッドが実行されている間、最初のスレッドに待機するように指示されます。2 番目のダウンロードが完了したら、Thread-1.notify() を呼び出して Thread-1 を再起動します。

Thread-1 をストリームの途中で一時停止したため、try{ } catch(){ } ステートメントを通過していないため、Thread-1 が再開したときにダウンロードが確実に完了し、スレッド内で呼び出すことができます。

于 2012-12-31T23:42:18.750 に答える