【问题标题】:Android Threading - running a thread from another thread and waiting for a handler messageAndroid Threading - 从另一个线程运行一个线程并等待处理程序消息
【发布时间】:2013-01-01 07:42:18
【问题描述】:

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

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

如果本地没有找到该位图,则使用另一个线程进行文件的下载。

所有线程都会创建一个 Looper,以确保可以从该线程创建 Handler(以防它需要通过向 Handler 发送消息来与另一个线程对话)

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

主线程要求 Thread-1 获取位图。如果位图存在,则成功返回给主线程。如果位图不存在,Thread-1 要求 Thread-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 中运行一个无限循环,以便它可以保持活动状态并继续处理消息直到它被中断,但我不确定如何正确执行此操作。

有人知道正确的做法吗?

【问题讨论】:

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

标签: java android multithreading


【解决方案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 恢复时保证下载完成,你可以将它调用到线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多