我编写了一个类,其中一系列实例旨在从AsyncTask调用,它将返回runReport()方法的结果.它创建一个工作线程就好了,但由于某种原因,它不会执行Callable的call()方法.我究竟做错了什么?
//Problem: doStuff() never gets called, even though the worker thread gets created.
@Override
public ReportResult runReport() throws InterruptedException, ExecutionException {
Callable report = new Callable() {
@Override
public ReportResult call() throws Exception {
doStuff();
...
return new ReportResult(varWrittenByMethod);
}
};
FutureTask result = new FutureTask(report);
//I tried a few of these ExecutorService factory methods, with the same result.
//I only made my own ThreadFactory to verify the worker was created
ExecutorService es = Executors.newSingleThreadExecutor(new ThreadFact());
es.submit(report);
ReportResult finalResult = result.get();
es.shutdownNow();
return finalResult;
}
private class ThreadFact implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
Log.d(TAG, "Created worker Thread");
return new Thread(r);
}
}
据我所知,我必须在它自己的Thread中作为FutureTask执行此操作,因为它需要执行以下操作(除了返回之外的所有内容都在doStuff()中):
>做一些重要的同步设置(AsyncTask保持关闭UI线程)
>调用Looper.prepare()
>注册一个听众
>调用Looper.loop(),在一段时间内从侦听器中捕获一些回调.
>当我有足够的数据点时,在侦听器回调中调用Looper.myLooper().quit()
>返回结果
我愿意接受更好的方法来做到这一点.我最初让AsyncTask进行此调用,然后在其线程上运行Looper.loop(),但我无法处理这些对象的队列,因为我需要在返回结果之前从侦听器调用Looper.myLooper.quit() ,这不可逆转地毒害了线程的消息队列.