LoginActivity просочилось окно DecorView@bb62df1 [LoginActivity], которое было первоначально добавлено здесь - PullRequest
1 голос
/ 18 февраля 2020

Я получаю сообщение об ошибке, что в моей активности при входе есть какое-то просочившееся окно. Это мой блок кода, в котором возникает ошибка. Я попытался закрыть диалоговое окно и окно оповещения соответственно, но все равно продолжаю получать эту ошибку.

    try
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
        builder.setTitle(R.string.login_ok_title);
        builder.setMessage(R.string.login_ok_text).setCancelable(false).setPositiveButton(R.string.ok, (dialog, id) ->
        {
            Intent intent =new Intent(LoginActivity.this, TrackActivity.class);
            startActivity(intent);
            TrackManagerService trackManager =TrackManagerService.getInstance();
            if (trackManager != null) {
                trackManager.setLoginListener(null);
            }

            LoginActivity.this.finish();
            dialog.dismiss();
        });
        alert = builder.create();
        alert.show();

    } 
    catch (Exception ex)
    {
        ex.printStackTrace();
        Intent intent = new Intent(LoginActivity.this, TrackActivity.class);
        alert.dismiss();
        startActivity(intent);
        TrackManagerService trackManager = TrackManagerService.getInstance();
        if (trackManager != null) 
        {
            trackManager.setLoginListener(null);
        }
        finish();
    }

Это журнал ошибок

E/WindowManager: android.view.WindowLeaked: Activity com.example.tornado_app.LoginActivity has leaked window DecorView@59e20b9[LoginActivity] that was originally added here
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:627)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:389)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:131)
    at android.app.Dialog.show(Dialog.java:531)
    at com.example.tornado_app.LoginActivity$2.lambda$onLoginResult$4$LoginActivity$2(LoginActivity.java:160)
    at com.example.tornado_app.-$$Lambda$LoginActivity$2$YvCiBtxWavxZ1iGtdLspSkuZOdU.run(Unknown Source:6)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:216)
    at android.app.ActivityThread.main(ActivityThread.java:7625)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Почему вы используете 2 раза dialog.dismiss(); и после завершения действия sh как вы можете закрыть диалоговое окно? Попробуйте добавить код ниже

try {
    AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
    builder.setTitle(R.string.login_ok_title);
    builder.setMessage(R.string.login_ok_text).setCancelable(false).setPositiveButton(R.string.ok, (dialog, id) ->
    {
        //dialog.dismiss(); //Remove this
        Intent intent = new Intent(LoginActivity.this, TrackActivity.class);
        startActivity(intent);

        TrackManagerService trackManager = TrackManagerService.getInstance();
        if (trackManager != null) {
            trackManager.setLoginListener(null);
        }

        LoginActivity.this.finish();
        //dialog.dismiss(); //Remove this
    });
    alert = builder.create();
    alert.show();

} catch (Exception ex) {
    ex.printStackTrace();
    Intent intent = new Intent(LoginActivity.this, TrackActivity.class);
    startActivity(intent);
    TrackManagerService trackManager = TrackManagerService.getInstance();
    if (trackManager != null) {
        trackManager.setLoginListener(null);
    }
    finish();
}

Надеюсь, это поможет вам!

2 голосов
/ 18 февраля 2020

Пожалуйста, попробуйте проверить, завершена ли активность, прежде чем показывать диалог.

 if (!isFinishing()){
       alert.show();
    }
...