我有一个创建的非活动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是一种不好的做法吗?
答案 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线程上运行,你不必担心。