检查带有进度对话框的异步任务是否在非 activity class 中完成

Check if asynctask with Progress Dialog is finished in non activity class

我创建了一个非 activity java class 用于从不同的活动中进行相同的计算。此 class 中包含带有进度对话框的异步任务。在大多数情况下,计算不是 activity 的最后一个操作,一切都很好,但是当它是时,我的进度对话框就丢失了。

示例:

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 完成然后完成 activity?


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

A​​syncTask 有一个 onPostExecute 方法,您可以从那里完成 activity

protected void onPostExecute(Long result) {
        progressDialog.dismiss();
        finish(); // you'll probably have to call finish() with a callback function
}

onPostExecute方法在doInBackground方法完成时被调用,在该方法上你可以完成activity并关闭进度对话框

如果你想在 AsyncTask 完成它的工作之前让你的 activity 保持活动状态,你可以在 activity 中定义一个回调方法,当任务完成时调用它并能做出适当的反应:

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 中保留对 activity 的引用。如果您从非 UI 线程调用 AsyncTask,您可能应该 运行 通过 Activity.runOnUiThread() 回调(以及涉及对话框的所有方法)。

至于第二个问题 - 如果您在 class 中使用 AsyncTask 可以从 UI 线程以外的线程调用哪些方法,则有必要使用 runOnUiThread() 在 UI 上执行任何操作,例如更改视图的内容或 showing/hiding 对话框,因为 onPreExecute()onPostExecute() 是从同一个调用的线程为 execute().

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