ProgressDialog и AlertDialog вызывают утечку окна

У меня есть Activity, который показывает приветственное сообщение, если он запущен в первый раз:

@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(); } } 

Все это прекрасно работает, однако, когда я запускаю приложение и сразу поворачиваю экран, я получаю известное исключенное исключение окна.

Как я могу это предотвратить? Есть ли лучший способ показать диалоги? Это также происходит, когда я использую ProgressDialog s в AsyncTask s в Fragment s.

Вам нужно отменить диалог в режиме onStop или onDestroy . Например:

 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(); }