[每次我尝试向用户显示警报对话框,然后用户使用警报内的按钮关闭该对话框。我收到以下错误。
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$2.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函数中,我使用了可运行的功能来显示如下所示的对话框:
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();
}
});
}
在阅读了有关此主题的许多其他stackoverflow问题之后,我如下添加了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();
}
}
虽然我的应用程序没有崩溃。该应用程序显示警报对话框,当我按下“重试”按钮时,该应用程序关闭,并显示上述错误。尝试了许多其他可能的方法来解决此问题。我在做什么错,活动已泄漏窗口?
修复了从onCreate()删除以下重复代码后的错误
if (getIntent().getStringExtra(getString(R.string.POS_CODE)) != null) {
RestApi restApi = new RestApi(this, context);
.......//rest code
}
由于onResume和onCreate中的代码相同,所以我发现Activity泄漏了窗口。现在从onCreate删除代码后,一切都很好。