gpt4 book ai didi

android - ProgressDialog 和 AlertDialog 导致窗口泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:20 24 4
gpt4 key购买 nike

我有一个 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();
}
}

这一切都很好,但是当我启动应用程序并立即旋转屏幕时,出现了众所周知的泄漏窗口异常。

我该如何防止这种情况发生?有没有更好的方式来显示对话框?当我在 Fragment 中的 AsyncTask 中使用 ProgressDialog 时也会发生这种情况。

最佳答案

您需要在 Activity 的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();
}

关于android - ProgressDialog 和 AlertDialog 导致窗口泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com