我有一个应用程序,它运行一个长任务并返回一个值。当任务运行时,aProgressDialog
显示进度。任务完成后,我想在TextView
中显示结果。我在未来任务中运行该任务。
我的问题是,如果我试图得到结果,futuretask的.get()
方法会阻塞ui线程,而我看不到ProgressDialog
(结果的TextView
属性显示)。
我的任务代码(池是ExecutorService):
final FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
@Override
public String call() {
return myLongTask();
}
});
pool.execute(future);
然后我在a
updateProgressBar()
中调用Runnable
,用aProgressDialog
更新Handler
:Runnable pb = new Runnable() {
public void run() {
myUpdateProgressBar();
}
};
pool.execute(pb);
现在我得到的结果是,阻止ui线程显示
ProgressDialog
:String result = future.get()
如果在ProgressDialog关闭后尝试将结果放入updateProgressBar()方法中(通过将Future作为参数传递),则会引发异常:
只有创建视图层次结构的原始线程才能接触其视图。
有什么办法解决这个问题吗?(我听说过异步任务,但我不知道如何正确地使用它们。)
最佳答案
您需要AsyncTask
或Thread
/Handler
组合才能不阻塞ui,这是正确的。
这两种方法都没有那么棘手,而且有一些很好的指导来说明如何做到这一点。下面是一些我推荐的链接。
AsyncTask
Painless threading
Threading
Designing for responsiveness
Thread documentation
Handler documentation