android.view.WindowLeaked:使用时显示警报对话框时出错
我已尝试在活动被销毁时关闭警报对话框android.view.WindowLeaked:使用时显示警报对话框时出错,android,Android,我已尝试在活动被销毁时关闭警报对话框 @Override public void onDestroy(){ super.onDestroy(); if (alertDialog != null && alertDialog.isShowing()) { alertDialog.dismiss(); } } 但我还是犯了一个错误: android.view.WindowLeaked: Act
@Override
public void onDestroy(){
super.onDestroy();
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
}
但我还是犯了一个错误:
android.view.WindowLeaked: Activity com.Forewarn.ForewarnApp.activities.SignInActivity has leaked window DecorView@60f300f[] that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:424)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:316)
at com.Forewarn.ForewarnApp.activities.SignInActivity.getFingerPrint(SignInActivity.java:713)
at com.Forewarn.ForewarnApp.activities.SignInActivity$8.onClick(SignInActivity.java:428)
at android.view.View.performClick(View.java:5612)
at android.view.View$PerformClick.run(View.java:22285)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
我在下面的方法中遇到了错误:在这个方法中,我使用了两个警报对话框
public void getFingerPrint(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(!fingerprintManager.isHardwareDetected()){
/**
* An error message will be displayed if the device does not contain the fingerprint hardware.
* However if you plan to implement a default authentication method,
* you can redirect the user to a default authentication activity from here.
* Example:
* Intent intent = new Intent(this, DefaultAuthenticationActivity.class);
* startActivity(intent);
*/
Toast.makeText(getApplicationContext(),"Your Device does not have a Fingerprint Sensor",Toast.LENGTH_SHORT).show();
//textView.setText("Your Device does not have a Fingerprint Sensor");
} else {
// Checks whether fingerprint permission is set on manifest
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
//textView.setText("Fingerprint authentication permission not enabled");
Toast.makeText(getApplicationContext(),"Fingerprint authentication permission not enabled",Toast.LENGTH_SHORT).show();
} else{
// Check whether at least one fingerprint is registered
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!fingerprintManager.hasEnrolledFingerprints()) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle);
alertDialogBuilder.setTitle("Touch ID isn't Set Up on This Device");
TextView myMsg = new TextView(this);
myMsg.setText("To set up Touch ID on this decice, go to Settings > Touch id & Passcode and add a valid fingerprint");
myMsg.setGravity(Gravity.CENTER_HORIZONTAL);
myMsg.setPadding(20,50,20,0);
myMsg.setTextColor(getResources().getColor(R.color.colorPrimary));
myMsg.setTextSize(15);
alertDialogBuilder.setView(myMsg);
//alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login");
alertDialogBuilder.setPositiveButton("Ok",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//finish();
//Toast.makeText(getApplicationContext(),"Hai",Toast.LENGTH_SHORT).show();
startActivityForResult(new Intent(Settings.ACTION_SETTINGS), 0);
}
});
alertDialog = alertDialogBuilder.create();
alertDialog.show();
//textView.setText("Register at least one fingerprint in Settings");
//Toast.makeText(getApplicationContext(),"Register at least one fingerprint in Settings",Toast.LENGTH_SHORT).show();
}else{
// Checks whether lock screen security is enabled or not
if (!keyguardManager.isKeyguardSecure()) {
//textView.setText("Lock screen security not enabled in Settings");
Toast.makeText(getApplicationContext(),"Lock screen security not enabled in Settings",Toast.LENGTH_SHORT).show();
}else{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle);
alertDialogBuilder.setIcon(R.drawable.fingerprint);
alertDialogBuilder.setTitle("Touch Id for FOREWARN");
TextView myMsg = new TextView(this);
if(hiddenEmail == null){
myMsg.setText("Sign In with User Id "+userName);
}else {
myMsg.setText("Sign In with User Id "+hiddenEmail);
}
myMsg.setGravity(Gravity.CENTER_HORIZONTAL);
myMsg.setPadding(10,50,10,0);
myMsg.setTextColor(getResources().getColor(R.color.colorPrimary));
myMsg.setTextSize(16);
alertDialogBuilder.setView(myMsg);
//alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login");
alertDialogBuilder.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//finish();
Constant.isCanceled = "true";
}
});
alertDialog = alertDialogBuilder.create();
alertDialog.show();
generateKey();
if (cipherInit()) {
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
FingerprintHandler helper = new FingerprintHandler(this);
helper.startAuth(fingerprintManager, cryptoObject);
}
}
}
}
}
}
}
}
我已经添加了调用dailog.disease()的ondestory
方法。
我搞不清楚我哪里做错了。请帮帮我
漏窗DecorView@60f300f[]这是最初添加的
- 如果对话框不是以前的
disclose()
,则会出现上述异常
活动
结束
添加此部分
纠正
if (cipherInit()) {
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
FingerprintHandler helper = new FingerprintHandler(this);
helper.startAuth(fingerprintManager, cryptoObject);
}
generateKey();
alertDialog = alertDialogBuilder.create();
alertDialog.show();
漏窗DecorView@60f300f[]这是最初添加的
- 如果对话框不是以前的
disclose()
,则会出现上述异常
活动
结束
添加此部分
纠正
if (cipherInit()) {
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
FingerprintHandler helper = new FingerprintHandler(this);
helper.startAuth(fingerprintManager, cryptoObject);
}
generateKey();
alertDialog = alertDialogBuilder.create();
alertDialog.show();
通常,当您的活动被销毁、完成、暂停等后试图显示对话框时,会发生此问题
一些解决方案:
- 检查您是否没有调用
alertDialog.show()
在完成、暂停或销毁活动并尝试控制它的同一父作用域中
例如,您启动了另一个活动或流程,然后尝试显示有关当前活动的对话框
- 如果(!this.isFinishing()){//show your dialog}
对于您的活动
在启动对话框之前,您还可以使用小技巧检查活动的状态:
@重写受保护的void onPause(){isRunning=false;}
@重写受保护的void onResume(){isRunning=true;}
通常,当您的活动被销毁、完成、暂停等后试图显示对话框时,会出现此问题
一些解决方案:
- 检查您是否没有调用
alertDialog.show()
在完成、暂停或销毁活动并尝试控制它的同一父作用域中
例如,您启动了另一个活动或流程,然后尝试显示有关当前活动的对话框
- 如果(!this.isFinishing()){//show your dialog}
对于您的活动
在启动对话框之前,您还可以使用小技巧检查活动的状态:
@重写受保护的void onPause(){isRunning=false;}
@重写受保护的void onResume(){isRunning=true;}
显示您的完整代码。您能看看我更新的代码吗?您能告诉我SignenActivity.java上有什么代码吗;电话号码:713?是的。在我的getFingerPrint()方法-->中,它是第二个alertdialog.show()-713行显示您的完整代码。您能看看我更新的代码吗?您能告诉我SignenActivity.java上有什么代码吗;电话号码:713?是的。在我的getFingerPrint()方法-->中,它是第二个alertdialog.show()-713 Linear。实际上,我的目的是在登录页面-->时,如果用户已使用指纹签名,它会显示触摸id的弹出窗口。因此,每次登录活动时,我都需要显示弹出窗口,如果用户已经设置了触摸id。实际上,我的目的是在登录页面-->时,如果用户已经使用指纹签名,则会显示触摸id的弹出窗口。因此,如果用户已经设置了触摸id,则每次登录活动时,我都需要显示弹出窗口。
if (cipherInit()) {
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
FingerprintHandler helper = new FingerprintHandler(this);
helper.startAuth(fingerprintManager, cryptoObject);
}
generateKey();
alertDialog = alertDialogBuilder.create();
alertDialog.show();