AsyncTask - 在一个长操作完成时更新进度

时间:2013-10-10 15:50:53

标签: java android android-asynctask

我正在开发一个Android应用程序,它有一个漫长的过程,我想报告进度。

拥有流程的来源,所以我无法让流程本身报告它的完成百分比。我必须以某种方式包装它。我还需要在后台运行该过程。

对我而言,这似乎是AsyncTask的一个好例子,但由于我有一个一个冗长的进程,我只能在开始和任务结束时报告进度。

在Android中编写此内容的最佳方式是什么,因此我可以将进度报告回UI,而冗长的进程(我没有源代码)正在运行?

我尝试在其中使用带有Handler的AsyncTask,但这似乎不起作用(失败:“java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序” )

编辑:注意,我在漫长过程的开始和结束时调用“publishProgress”。我需要弄清楚如何在我的一个巨大进程运行时调用它。

编辑2:如果我没有报告,UI会终止我的流程,所以我必须在运行时报告...

2 个答案:

答案 0 :(得分:1)

这是一个解决方案,因为它得到了骇人听闻。

public class LongAction {
    public AtomicBoolean finished = new AtomicBoolean();
    private final Handler h;      

    /* attributes you need */

    public LongAction(Handler h /* parameters you need to initialice attibutes */) {
        this.h = h;
        // Initialization
    }

    public void doLongTask() {
        finished.set(false);
        new Runnable() {
            @Override
            public void run() {
                // your long task
                finished.set(true);
            }
        }.run();
        new Runnable() {
            @Override
            public void run() {
                while (!finished.get()) {
                }
                Message m = Message.obtain();
                m.what = 0;
                m.arg1 = 50;
                h.sendMessage(m);
            }
        }.run();
    }
}

答案 1 :(得分:0)

我不确定你能做什么,因为你无法控制长时间运行的任务。基本的AsyncTask看起来足够你想要的东西。

您可以在AsyncTask.doInBackground()中显示告诉用户正在进行操作(或启动某些动画)的文本。然后在AsyncTask.onPostExecute()中显示完成消息(或停止动画)。

我不太清楚你还能做些什么。我不认为AsyncTask.onProgress()对你的情况有用。

不直接相关:您可能还希望在操作正在进行时禁用Activity中的某些功能。你还必须小心你想要做什么关于生命周期(如果活动在进程正在进行时被杀死)。