我有一个活动,如果第一次启动,显示欢迎信息:
@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(); } }
这一切都很美妙,但是当我启动应用程序,并立即旋转屏幕,我得到了众所周知的泄漏窗口异常.
我该如何防止这种情况?有更好的方式来显示对话吗?当我在Fragments中的AsyncTasks中使用ProgressDialogs时也会发生这种情况.
解决方法
您需要在活动的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",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(); }