2010-07-31 79 views
0

我有一個像這樣加載AlertDialog的活動。使用上下文和AlertDialog/AsyncTask處理方向更改

 progressDialog = new ProgressDialog(MyActivity.this); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.setMessage("Doing Something"); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 

我也有一個擴展的AsyncTask

private class MyBackgroundTask extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... params) { 

      ...do stuff 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 

      progressDialog.dismiss(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 

     } 

    } 

如果另一個類的屏幕變化我得到試圖連接到不存在的觀點錯誤的方向。這是因爲該活動已被銷燬,環境已消失。

因此,我將此添加到onDestroy()並修復它。

@Override 
    public void onDestroy() { 

     if(progressDialog!=null) 
      if(progressDialog.isShowing()) 
       progressDialog.cancel(); 

     if(background!=null) 
      background.cancel(true); 
    } 

但這意味着我一直要保持到對話框和的AsyncTask

參考

,所以我不能例如做到這一點:

new MyAsyncTask().execute(); 

萬一方向改變,同樣我不能這樣做:

new AlertDialog.Builder(this) 
    .setIcon(android.R.drawable.ic_dialog_alert) 
    .setTitle("some title") 
    .setMessage("some message") 
    .setPositiveButton(R.string.ok, null) 
    .show(); 

這看起來不正確,我必須有一個更好的華Ÿ,我知道你可以使用getApplicationContext(),但在某些情況下這是不可行的。

我該如何妥善管理?

回答

0

我都幾乎相同的問題,我認爲處理這不是那麼簡單的方式,你有兩個選擇:

  1. 使活動辦理 配置變化本身,所以你 不會有活動死亡,但 那麼你將不得不打電話 對話框的invalidate或requestLayout 我認爲。
  2. 使自己的進度對話框(從AlertDialog或Dialog類繼承,並有保存它的當前狀態,並使用它,如果對話框是在saveInstanceState的內部方法。並在需要時恢復它。

你只有剩下的問題是異步任務 如果你在一個活動中啓動了一個異步任務,我不知道這個任務是什麼,基本上爲了避免它,你需要一個在Application onCreate中啓動並死於它是爲你做這些事情的onDestroy,所以它是獨立於活動的,或者你需要使用帶有粘性廣播的服務,所以即使你的活動因爲方向改變而沒有監聽廣播,它也會在廣播出現之後得到廣播。開啓並傾聽。 這樣你就沒有義務持有你的Activity的一個實例,它將被清空或處於無效狀態以供你的服務處理。