检查在非活动类中是否完成了Progress Dialog的asynctask

时间:2015-07-30 08:33:29

标签: android android-asynctask progressdialog

我有一个创建的非活动java类,用于从不同的活动进行相同的计算。这个类有asynctask with progress对话框。在大多数情况下,计算不是活动的最后一次操作,一切都很顺利,但是当我的进度对话丢失时。

示例:

myJavaClass doCalculations= new myJavaClass (SomeActivity.this);

doCalculations.Do(); //<------ method Do has asysctask with Progress Dialog

finish();

结果:

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{2bbf820e V.E..... R......D 0,0-1026,483} not attached to window manager

我如何等待asynctask完成然后完成活动?

附加问题:在非活动类中使用asynctask是一种不好的做法吗?

2 个答案:

答案 0 :(得分:0)

AsyncTask有一个yourname@domain.com方法,您可以从那里完成活动

onPostExecute

protected void onPostExecute(Long result) { progressDialog.dismiss(); finish(); // you'll probably have to call finish() with a callback function } 方法完成后调用onPostExecute方法,在该方法上,您可以完成活动并关闭progressdialog

答案 1 :(得分:0)

如果要在AsyncTask完成其作业之前保持活动处于活动状态,则可以在任务完成时调用的活动中定义回调方法,并且可以做出适当的反应:

Activity

private boolean finishAfterCurrentTask = false;

public void onTaskFinished() {
    if (finishAfterCurrentTask) { // set this to true when running the last task
        finish();
    }
}

AsyncTask

protected void onPostExecute(Object result) {
    progressDialog.dismiss();
    activity.onTaskFinished();
}

我假设您在myJavaClass中保留对活动的引用。如果您从非UI线程调用AsyncTask,您应该通过Activity.runOnUiThread()运行回调(以及涉及对话框的所有方法)。

至于第二个问题 - 如果在类中使用AsyncTask哪个方法可以从UI线程以外的线程调用,则需要使用runOnUiThread()来执行任何操作。用户界面,例如更改视图内容或显示/隐藏对话框,因为onPreExecute()onPostExecute()来自与execute()相同的帖子。

另一方面,如果你在一个UI回调中启动任务,保证在UI线程上运行,你不必担心。