我正在开发一个Android应用程序,它有一个漫长的过程,我想报告进度。
我不拥有流程的来源,所以我无法让流程本身报告它的完成百分比。我必须以某种方式包装它。我还需要在后台运行该过程。
对我而言,这似乎是AsyncTask的一个好例子,但由于我有一个一个冗长的进程,我只能在开始和任务结束时报告进度。
在Android中编写此内容的最佳方式是什么,因此我可以将进度报告回UI,而冗长的进程(我没有源代码)正在运行?
我尝试在其中使用带有Handler的AsyncTask,但这似乎不起作用(失败:“java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序” )
编辑:注意,我在漫长过程的开始和结束时调用“publishProgress”。我需要弄清楚如何在我的一个巨大进程运行时调用它。
编辑2:如果我没有报告,UI会终止我的流程,所以我必须在运行时报告...
答案 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中的某些功能。你还必须小心你想要做什么关于生命周期(如果活动在进程正在进行时被杀死)。