我正在处理推送通知。问题是当我加载一个非常巨大的表单并且我收到通知时,在表单完全加载之前我尝试点击通知我在5-6秒后得到一个空白屏幕。该例外是由于dialog.dismiss。
根据我的理解,在打开通知时,当前活动被销毁,新活动被创建。在创建新活动时,我使用asynctask来完成我的应用程序中的其他功能。因此,当当前活动被销毁时,活动上下文为空,但是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。
答案 0 :(得分:5)
您可以停止运行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
答案 1 :(得分:2)
您可以致电cancel(Boolean)取消AsyncTask。有关该页面上“取消任务”的更多用法信息ctrl-f
答案 2 :(得分:1)
我认为问题的最佳解决方案是让你的asyntask检查是否还有应用程序正在运行。如果不是简单的退出。在Activity.onPause中设置一个标志,并在发送一些输出之前让asynctask检查它。