1

我正在处理推送通知。问题是当我加载一个非常大的表单并且我收到通知时,在表单完全加载之前我尝试点击通知我在 5-6 秒后得到一个空白屏幕。异常是由于 dialog.dismiss。

据我了解,在打开通知时,当前活动被销毁,一个新活动被创建。在创建新活动时,我正在使用 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() 中打印活动上下文,它为空。

4

3 回答 3

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

于 2013-02-06T19:44:06.083 回答
2

您可以通过调用cancel(Boolean)来取消 AsyncTask 。有关该页面上“取消任务”的更多使用信息 ctrl-f

于 2013-02-06T19:28:52.723 回答
1

我认为这个问题的最佳解决方案是让您的 asyntask 检查是否仍有应用程序在运行。如果不是简单地退出。在 Activity.onPause 中设置一个标志,让异步任务在发送一些输出之前检查它。

于 2013-02-06T19:33:55.037 回答