2014-03-31 34 views
0

我在用戶登錄時啓動一項服務,該服務具有使用AsyncTask在後臺下載許多附件的功能。爲什麼進度對話框仍然顯示並且當前的異步任務正在等待以前的異步任務?

附件的後臺下載正在進行中並且用戶登錄到應用程序時,我將設備從橫向旋轉到縱向。

在縱向,我有另一種功能來使用AsyncTask計算背景中的某些數據。此功能包含下面的代碼 -

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Calculating..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Integer doInBackground(Integer... args) { 
     //Some data processing 

    } 

    @Override 
    protected void onPostExecute(Integer file_url) { 
     super.onPostExecute(file_url); 

     if(pDialog.isShowing()) { 
      pDialog.dismiss(); 
      pDialog.cancel(); 
     } 

    } 

問題是 -

當我旋轉設備爲縱向 -

1)進度對話框永遠不會被解僱,直到我重新啓動/重新啓動應用程序。

2)縱向佈局等待附件後臺任務完成,只有它然後計算在自己的佈局在後臺的異步數據。

3)當異步數據的計算完成時,縱向佈局被計算的數據填充,但進度對話框仍然不會被解除,直到應用程序重新啓動。

+2

當活動被破壞,所以'pDialog'引用,它被重新創建我使AsyncTask有一個變量,不存在的引用 – tyczj

回答

1

你必須記住,在方向改變你的資源被重新分配和重新創建(因爲Activity本身被銷燬)。

在Android開發人員網站上有關於此的一些信息,您可以查看此特定主題here

0

這是使用靜態內部Handler來解決的,以處理數據的後臺處理。

下面的代碼工作完美 -

(縱向)

static class BoardHandler extends Handler { 
    private final WeakReference<BoardFragment> mService; 

    BoardHandler(BoardFragment service) { 
    mService = new WeakReference<BoardFragment>(service); 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
    BoardFragment service = mService.get(); 
    if (service != null) { 
      service.summaryData(msg); 

      if(pDialog != null && pDialog.isShowing()) 
      pDialog.dismiss(); 
    } 
    } 
} 

public void displayChart(final int maxDays) { 

    BoardHandler myHandler = new BoardHandler(this); 

    myHandler.sendEmptyMessage(maxDays); 

} 


public void summaryData(Message msg) 
{ 
    //Data processing goes here. 
} 

注意,內部處理程序類中使用的WeakReference的是如何幫助不僅消除了內存泄漏也顯示進度對話框。

Projess對話框顯示過程是在將片段添加到backstack並在活動中進行提交時完成的,而在summaryData method完成其執行後調用對話框銷燬。

這可能有助於解決類似問題的人數天。