簡體   English   中英

活動已銷毀,但asynctask仍在運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM