Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Android会在超级活动中创建的对话框的扩展活动中泄漏窗口,甚至调用了Disclose?_Java_Android_Exception_Memory Leaks - Fatal编程技术网

Java 为什么Android会在超级活动中创建的对话框的扩展活动中泄漏窗口,甚至调用了Disclose?

Java 为什么Android会在超级活动中创建的对话框的扩展活动中泄漏窗口,甚至调用了Disclose?,java,android,exception,memory-leaks,Java,Android,Exception,Memory Leaks,我正在做一个Android项目。我有一个扩展了AppCompatActivity的BaseActivity,还有一个扩展了BaseActivity的活动StartActivity。我正在调用BaseActivity中的AlertDialog AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setCancelable(false); alertDialog.s

我正在做一个Android项目。我有一个扩展了
AppCompatActivity
BaseActivity
,还有一个扩展了
BaseActivity
的活动
StartActivity
。我正在调用BaseActivity中的AlertDialog

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

        alertDialog.setCancelable(false);
        alertDialog.setTitle(getResources().getString(R.string.title_attention));
        alertDialog.setMessage(getResources().getString(R.string.message_permission_denied));

        alertDialog.setPositiveButton(getResources().getString(R.string.button_settings), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                        Uri.parse("package:" + getApplicationContext().getPackageName()));

                myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
                myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                getApplicationContext().startActivity(myAppSettings);
            }
        });
        alertDialog.setNegativeButton(getResources().getString(R.string.button_exit),
                new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                aDialog.dismiss();
                finish();

            }
        });
        aDialog = alertDialog.create();

        aDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                aDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorButtonPositive));
                aDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorButtonNegative));
            }
        });

        if (!aDialog.isShowing())
            aDialog.show();
我还重写了BaseActivity中的
onDestroy
方法

@Override
    protected void onDestroy() {
super.onDestroy();
        try{
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (aDialog != null && aDialog.isShowing()) {
                        aDialog.dismiss();
                    }
                }
            });
        }catch (Exception e){
            new ErrorPrinter(e.toString());
        }
    }
堆栈跟踪/错误日志

01-13 08:38:59.928 5501-5501/com.company.android E/WindowManager: android.view.WindowLeaked: Activity com.company.android.activities.StartActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{7a59bc1 V.E...... R......D 0,0-1160,413} that was originally added here
                                                                                        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368)
                                                                                        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
                                                                                        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                                        at android.app.Dialog.show(Dialog.java:319)
                                                                                        at com.company.android.activities.BaseActivity.permissionDenied(BaseActivity.java:216)
                                                                                        at com.company.android.activities.BaseActivity.onRequestPermissionsResult(BaseActivity.java:160)
                                                                                        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
                                                                                        at android.app.Activity.dispatchActivityResult(Activity.java:6460)
                                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                                                                                        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                                                                                        at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-13 08:38:59.928 5501-5501/com.company.android E/WindowManager:android.view.WindowLeaked:Activity com.company.android.activities.StartActivity泄漏了window com.android.internal.policy.PhoneWindow$DecorView{7a59bc1 V.E……R……d0,0-1160413},最初添加到这里
在android.view.ViewRootImpl。(ViewRootImpl.java:368)
位于android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
在android.app.Dialog.show上(Dialog.java:319)
位于com.company.android.activities.BaseActivity.permissionDenied(BaseActivity.java:216)
位于com.company.android.activities.BaseActivity.onRequestPermissionsResult(BaseActivity.java:160)
位于android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
位于android.app.Activity.dispatchActivityResult(Activity.java:6460)
位于android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
位于android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
位于android.app.ActivityThread.-wrap16(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
但我在安卓显示器上遇到了一个例外,StartActivity泄露了最初添加到这里的窗口。谁能告诉我如何解决这个错误

我扩展到BaseActivity的原因是,我想对所有活动使用一些功能,这样我就可以一次性编写或删除代码,并且它将在所有活动中使用


谢谢。

这是因为当活动暂停时,会对其进行垃圾收集,但由于对话框仍未关闭,因此警报对话框仍有对该活动的引用

您需要在BaseActivity中重写onPause()和onStop():

@Override
  public void onPause() {
      super.onPause();

      if(aDialog != null)
          aDialog.dismiss();
  }

@Override
protected void onStop() {
    super.onStop();

    if(aDialog != null)
        aDialog.dismiss();
}
另一个活动启动时,在
alertDialog.setPositiveButton()
中的这一行之后关闭对话框并完成活动:

getApplicationContext().startActivity(myAppSettings);
aDialog.dismiss();
finish();  

我必须重写
finish()
方法,并通过获取进程id终止我的进程

@Override
    public void finish() {
        super.finish();
        android.os.Process.killProcess(android.os.Process.myPid());
    }

谢谢大家的帮助和支持

尝试将onStop()覆盖到更新的代码,
onPause
onStop
并且我已经覆盖了
onDestroy
,但是它仍然从扩展活动中泄漏,扩展活动是
StartActivity
。在调用之前检查您的对话框上下文是否为空show@AmeyShirke当我单击“退出”选项的负按钮时失败。请尝试将您的对话框引用另存为weakreference,然后使用此weakreference来使用您的对话框Post-your stacktrace,以便我们可以看到问题所在