我的应用程序使用Executor创建线程来执行任务。
我有一个线程,可以在需要时加载并返回主线程的位图。
如果在本地找不到位图,则使用另一个线程来下载文件。
所有线程都创建一个Looper,以确保可以从该线程创建处理程序(如果需要通过向处理程序发送消息来与另一个线程通信)
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中运行一个无限循环,这样它就可以保持活动并继续处理消息,直到它被中断,但我不确定如何正确地执行此操作。
任何人都知道正确的方法吗?
答案 0 :(得分:0)
我不确定你是否想这样做,但是你可以在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恢复时保证下载完成,您可以将其调用到线。