Java Android线程-从另一个线程运行线程并等待处理程序消息

Java Android线程-从另一个线程运行线程并等待处理程序消息,java,android,multithreading,Java,Android,Multithreading,我的应用程序使用执行器创建线程来执行任务 我有一个线程,可以在需要时将位图加载并返回到主线程 如果在本地找不到位图,则使用另一个线程下载该文件 所有线程都会创建一个循环器,以确保可以从该线程创建处理程序,以防它需要通过向处理程序发送消息与另一个线程通信 public class LooperThread extends Thread { @Override public void run() { Looper.prepare(); sup

我的应用程序使用执行器创建线程来执行任务

我有一个线程,可以在需要时将位图加载并返回到主线程

如果在本地找不到位图,则使用另一个线程下载该文件

所有线程都会创建一个循环器,以确保可以从该线程创建处理程序,以防它需要通过向处理程序发送消息与另一个线程通信

public class LooperThread extends Thread
{ 
    @Override
    public void run()
    {
        Looper.prepare();
        super.run();
        Looper.loop();
    }
}
主线程要求线程1获取位图。如果位图存在,它将成功返回到主线程。如果位图不存在,线程1会要求线程2下载它。在线程1上创建了一个处理程序,因此线程2可以使用它来告诉线程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));
    }
});
我认为我需要在Thread-1中运行一个无限循环,这样它就可以保持活动状态并继续处理消息,直到消息被中断,但我不确定如何正确地执行此操作


有人知道正确的方法吗?

我不确定您是否想这样做,但您可以在thread-1中尝试类似的代码

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

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

}
这将启动第二个线程下载位图,然后告诉第一个线程等待第二个线程继续运行。第二个线程完成下载后,您需要调用Thread-1.notify以重新启动Thread-1


因为您暂停了Thread-1中流,它不会超过try{}catch{}语句,所以保证在Thread-1恢复时完成下载,您可以将其调用到线程中

线程1如何停止?循环器不会停止,除非你告诉他们这样做。我假设一旦线程退出了它的run方法,线程将不再在它的消息循环中处理消息。我没有明确停止线程或循环器-线程由执行器管理。如果消息循环仍在运行,那么真正的问题是为什么从线程2发送的消息没有被线程1接收到?Looper.loop是一个无限循环。来自内部messagequeue的消息在该循环中处理。所以,你不能等待消息被传递,因为你在等待自己。不知道你是不是这样做的。还可以看看-他们已经实现了活套逻辑,所以你不必这么做。嗯,好的,谢谢。这仍然不能解释为什么RequestHandler.HandleMessageMessageM没有收到从线程2发送的消息。[RequestHandler.handleMessage调用上面第二个代码块中定义的onCompleteObject响应方法]有什么想法吗?您需要弄清楚线程1退出的原因。您可以发布显示主线程如何要求thread-1获取位图的代码吗?