2017-01-13 13 views
0

私はAndroidプロジェクトに取り組んでいます。私はBaseActivityを持っていて、AppCompatActivityに達していて、私にはBaseActivityに広がる別のアクティビティStartActivityを持っています。私は呼び出しているBaseActivityのAlertDialogを持っています。なぜスーパーアクティビティで作成されたダイアログの拡張アクティビティでAndroidがリークしているのですか?

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メソッドをオーバーライドしています、StartActivityが漏れた

@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()); 
     } 
    } 

のStackTrace /エラー・ログ

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) 

しかし、私はAndroidのモニターで例外を取得していますウィンドウものもともとはここに追加されました。誰も私にこのエラーを解決する方法を教えてもらえますか?

私がBaseActivityに拡張している理由は、すべてのアクティビティにいくつかの機能を使いたいので、コードを一度書くか削除することができ、すべてのアクティビティで使用されます。

ありがとうございました。

+1

stacktraceを投稿すると、どこに問題があるのか​​がわかります –

答えて

0

アクティビティが一時停止されているため、ガベージコレクトされますが、ダイアログがまだ消されないため、アラートダイアログには引き続きアクティビティへの参照があります。

はあなたの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(); 
+0

私もそれを試しましたが、動作していません! –

+0

onStop()もオーバーライドしてみてください –

+0

これはどちらもうまくいきませんでした! –

0

私はfinish()メソッドをオーバーライドして、プロセスIDを取得してプロセスを強制終了しなければなりませんでした。

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

ご協力いただきありがとうございます。

関連する問題