活动被破坏但是asynctask仍在运行

时间:2013-02-06 19:18:33

标签: android

我正在处理推送通知。问题是当我加载一个非常巨大的表单并且我收到通知时,在表单完全加载之前我尝试点击通知我在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。

3 个答案:

答案 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检查它。