1

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

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

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

在 Android 中编写这个的最佳方式是什么,这样我就可以在运行冗长的过程(我没有源代码)运行时向 UI 报告进度?

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

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

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

4

2 回答 2

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();
    }
}
于 2013-10-10T15:52:50.027 回答
0

我不确定您是否可以做任何其他事情,因为您无法控制长期运行的任务。基本的 AsyncTask 看起来足以满足您的需求。

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

我不太明白你还能做什么。我认为 AsyncTask.onProgress() 对您的情况没有用。

不直接相关:您可能还希望在操作进行时禁用 Activity 中的某些功能。您还必须小心您想要对生命周期执行的操作(如果 Activity 在进程进行时被终止)。

于 2013-10-10T16:51:31.920 回答