![](/img/trans.png)
[英]What happens to an AsyncTask when the launching activity is stopped/destroyed while it is still running?
[英]Activity is destroyed but asynctask is still running
我正在处理推送通知。 问题是当我正在加载一个非常庞大的表单并且收到通知时,在表单完全加载之前,我尝试单击通知,在5-6秒后出现空白屏幕。 例外是由于dialog.dismiss。
根据我的理解,在打开通知时,当前活动被破坏了,同时创建了一个新活动。 在创建新活动时,我正在使用asynctask来完成我的应用程序中的其他功能。 因此,当当前活动被销毁时,活动上下文为null,但asynctask仍在运行,并且还会显示进度对话框。 一旦活动被销毁,将没有窗口显示对话框,因此窗口泄漏异常。
任何人都可以帮助我摆脱这个问题。当应用长时间处于空闲状态时,我也会出现空白屏幕,然后打开通知。
一旦活动被破坏,有没有办法停止运行asynctask。
我的代码是:
公共类MainActivity扩展了Activity {
private MyProgressDialog myProgressDialog;
public LinearLayout mainPanel;
private VMobilet mobilet = null;
private String mobiletId;
private String formId ;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(mainPanel);
Intent i = getIntent();
mobiletId = i.getStringExtra("Mobilet Id");
formId = i.getStringExtra("Form ID");
VUiHelper.getInstance().setIsFinish(false);
myProgressDialog = MyProgressDialog.show(MainActivity.this,"","",true);
BackgroundTask backgroundTask = new BackgroundTask();
backgroundTask.execute(MainActivity.this);
}
@Override
protected void onPause() {
super.onPause();
if(VUiHelper.getInstance().isFinish())
{
this.finish();
}
else {
System.out.println("pausing mainactivity");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("mainactivity ondestroy called");
if(mobilet != null)
mobilet.getForms().clear();
mobilet = null;
mainPanel = null;
VUiHelper.getInstance().clearControlCache();
VUiHelper.getInstance().MediaInput.clear();
System.gc();
}
private class BackgroundTask extends AsyncTask<Context, String, Boolean> {
@Override
public void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Context... arg0) {
if (mobiletId != null) {
** some logic **
}
return true;
}
@Override
public void onPostExecute(Boolean status){
super.onPostExecute(status);
myProgressDialog.dismiss(); //dismissing the progress dialogs
if (mobilet != null) {
** some logic **
} else {
** some logic **
}
}
}
}
}
我尝试在onDestroy()中打印活动上下文,它为null。
您可以停止运行Asynctask(只要您对其有引用)。 您可能想做这样的事情
开始时:
Task ref = new Task();
ref.execute()
然后在onPause()
if(ref != null)
ref.cancel(true);
然后在doInBackground()内部,如果您定期执行某项操作(例如下载),则应执行以下操作:
if(isCanceled())
{
return;
}
上面的代码片段应允许您正常退出asynctask。
也在您的onPause中
if(myProgressDialog != null)
{
if(myProgressDialog.isShowing())
{
myProgressDialog.dismiss()
}
myProgressDialog = null
}
然后在你的onPostExecute
if(myProgressDialog != null)
{
if(myProgressDialog.isShowing())
{
myProgessDialog.dismiss;
myProgessDialog = null;
}
}
在onPuase中将myProgessDialog设置为null应该在onPOstExecute()中将其设置为null
您可以通过调用cancel(Boolean)取消AsyncTask。 有关该页面上“取消任务”的更多用法信息ctrl-f
我认为对该问题的最佳解决方案是让您的asyntask检查是否仍在运行应用程序。 如果不是,直接退出。 在Activity.onPause中设置一个标志,并让asynctask在发送一些输出之前检查它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.