我有一个应用程序,它运行一个长任务并返回一个值。当任务运行时,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);

然后我在aupdateProgressBar()中调用Runnable,用aProgressDialog更新Handler
Runnable pb = new Runnable() {
    public void run() {
        myUpdateProgressBar();
    }
};
pool.execute(pb);

现在我得到的结果是,阻止ui线程显示ProgressDialog
String result = future.get()

如果在ProgressDialog关闭后尝试将结果放入updateProgressBar()方法中(通过将Future作为参数传递),则会引发异常:
只有创建视图层次结构的原始线程才能接触其视图。
有什么办法解决这个问题吗?(我听说过异步任务,但我不知道如何正确地使用它们。)

最佳答案

您需要AsyncTaskThread/Handler组合才能不阻塞ui,这是正确的。
这两种方法都没有那么棘手,而且有一些很好的指导来说明如何做到这一点。下面是一些我推荐的链接。
AsyncTask
Painless threading
Threading
Designing for responsiveness
Thread documentation
Handler documentation

07-24 09:49
查看更多