2012-06-15 41 views
10

我有這表明,如果開始的第一次一個值得歡迎的消息的活動:ProgressDialog和AlertDialog原因泄露的窗口

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    showWelcomeMessageIfNecessary(); 
} 

private void showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

這一切精美的作品,但是當我啓動應用程序,並立即旋轉屏幕,我得到了衆所周知的泄露窗口例外。

我會如何防止這種情況發生?有更好的方法來顯示對話框嗎?當我在Fragment s的AsyncTask s中使用ProgressDialog s時也會發生這種情況。

+0

可能是'新AlertDialog.Builder(this.getParent());'不確定 –

回答

18

您需要取消活動的對話框onStoponDestroy方法。例如:

private AlertDialog diag = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    diag = showWelcomeMessageIfNecessary(); 

    if(diag != null) 
     diag.show(); 
} 

private AlertDialog showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 
    AlertDialog alert = null; 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     alert = builder.create(); 
    } 

    return alert; 
} 


@Override 
protected void onStop() { 
    super.onStop(); 

    if(diag != null) 
     diag.dismiss(); 
} 
+0

好的,這個工程。我想我現在明白了。如果您不關閉對話框'onStop()',對話框仍然顯示,並附加到一箇舊的「Activity」。有點混亂,因爲'onShow()'線出現異常,導致我認爲當* starting *顯示對話框時我泄露了窗口。 – nhaarman

+0

是的,當活動上的對話框設置爲可見時,但活動本身以某種方式被破壞,則會導致泄漏的窗口錯誤 – waqaslam

相關問題