Activity 在使用 alertDialog 时泄露了 window DecorView

Activity has leaked window DecorView while using alertDialog

每次我尝试向用户显示警告对话框时,用户使用警告中的按钮关闭对话框。我收到以下错误。

E/WindowManager: android.view.WindowLeaked: Activity SplashActivity has leaked window DecorView@5f814ed[SplashActivity] that was originally added here
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:765)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:440)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
    at android.app.Dialog.show(Dialog.java:473)
    at SplashActivity.errorDialogue(SplashActivity.java:363)
    at SplashActivity.run(SplashActivity.java:196)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:8016)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)

我编写并尝试过的代码如下:

private AlertDialog errorApiAlertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (getIntent().getStringExtra(getString(R.string.POS_CODE)) != null) {
        RestApi restApi = new RestApi(this, context);
restApi.checkPOS(getIntent().getStringExtra(getString(R.string.RTR_TOKEN_ID)), getIntent().getStringExtra(getString(R.string.DEVICE_IMEI)),
            getIntent().getStringExtra(getString(R.string.TRANSACTION_ID)));
        System.out.println("token in skitto: " + getIntent().getStringExtra(getString(R.string.RTR_TOKEN_ID)));
        System.out.println("imei in skitto: " + getIntent().getStringExtra(getString(R.string.DEVICE_IMEI)));;
        System.out.println("transaction in skitto: " + getIntent().getStringExtra(getString(R.string.TRANSACTION_ID)));
        System.out.println("POS in skitto: " + getIntent().getStringExtra(getString(R.string.POS_CODE)));
    }
}
    @Override
protected void onResume() {
    super.onResume();

    if (getIntent().getStringExtra(getString(R.string.POS_CODE)) != null) {
        RestApi restApi = new RestApi(this, context);
restApi.checkPOS(getIntent().getStringExtra(getString(R.string.RTR_TOKEN_ID)), getIntent().getStringExtra(getString(R.string.DEVICE_IMEI)),
                getIntent().getStringExtra(getString(R.string.TRANSACTION_ID)));
        System.out.println("token in skitto: " + getIntent().getStringExtra(getString(R.string.RTR_TOKEN_ID)));
        System.out.println("imei in skitto: " + getIntent().getStringExtra(getString(R.string.DEVICE_IMEI)));;
        System.out.println("transaction in skitto: " + getIntent().getStringExtra(getString(R.string.TRANSACTION_ID)));
        System.out.println("POS in skitto: " + getIntent().getStringExtra(getString(R.string.POS_CODE)));
    }
}

然后在 onResponseLoaded 函数中,我使用 runnable 函数显示如下对话框:

runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    errorDialogue("Incorrect validation. Please try again"); <-- error here
                }
            });

public void errorDialogue(String message) {

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

    LayoutInflater inflater = this.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.alert_failed_pos_login, null);
    dialogBuilder.setView(dialogView);
    TextView descriptionTextView = (TextView) dialogView.findViewById(R.id.failedMsg);
    descriptionTextView.setText(message);
    //Do your UI operations like dialog opening or Toast here
    errorApiAlertDialog = dialogBuilder.create();
    errorApiAlertDialog.show();  <-- error here

    final Button retryBtn = (Button) dialogView.findViewById(R.id.btntryAgain);
    retryBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            errorApiAlertDialog.dismiss();
            finish();
        }
    });
}

在阅读了关于该主题的许多其他 Whosebug 问题后,我添加了 onPause() 和 onStop() 方法如下:

    @Override
protected void onPause() {
    super.onPause();
    if (errorApiAlertDialog != null && errorApiAlertDialog.isShowing()) {
        errorApiAlertDialog.dismiss();
    }
}

@Override
protected void onStop() {
    super.onStop();
    if (errorApiAlertDialog != null && errorApiAlertDialog.isShowing()) {
        errorApiAlertDialog.dismiss();
    }
}

虽然我的应用程序没有崩溃。该应用程序显示警报对话框,当我按下重试按钮时,该应用程序关闭并显示上述错误。尝试了许多其他可能的方法来解决这个问题。 activity 泄露了 window,我在这里做错了什么?

修复了从 onCreate() 中删除以下重复代码后的错误

if (getIntent().getStringExtra(getString(R.string.POS_CODE)) != null) {
    RestApi restApi = new RestApi(this, context);
.......//rest code

}

由于 onResume 和 onCreate 中的代码相同,我得到 Activity has leaked windows。现在从 onCreate 中删除代码后,一切都很好。