检查带有进度对话框的异步任务是否在非 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 是一种不好的做法吗?
AsyncTask 有一个 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 线程上,您不需要担心那个。
我创建了一个非 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 是一种不好的做法吗?
AsyncTask 有一个 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 线程上,您不需要担心那个。