Завершение текущего действия после того, как действие AlertDialog выдает ошибку - PullRequest
0 голосов
/ 31 октября 2019

У меня проблема с AlertDialog: если я хочу завершить текущее действие после того, как открываю новое, у меня происходит сбой со следующей ошибкой:

E/WindowManager: android.view.WindowLeaked: Activity com.myapp.ShowsActivity has leaked window DecorView@2435213[ShowsActivity] that was originally added here

Это происходит, когда я хочу выйти из системы. Метод AuthLogic.logout () вызывается (я экспортировал его в отдельный класс, чтобы иметь более читаемый код), который вызывает «Вы уверены?»диалоговое окно оповещения, которое затем перенаправляет на вход в систему. Логика кнопки выхода из системы:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_shows)

        // some code . . .

        btnLogout.setOnClickListener {
            AuthLogic.logout(this)
            finish() // *1
    }
}

AuthLogic.logout ():

fun logout(context: Context) {
        val builder = AlertDialog.Builder(context)
        builder.setTitle(R.string.are_you_sure)
        builder.setMessage(R.string.confirm_msg_logout)
        builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->
                // aditional logout logic
                context.startActivity(AuthActivity.newStartIntent(context))
            }
            builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
            builder.show()
        }

Я заметил, что ошибка появляется, если я заканчиваю свою работу над * 1 комментарием. Если я удаляю эту строку, ошибка не отображается, но это вызывает проблему, потому что я могу вернуться к предыдущему действию и не хочу этого. Я уже пытался использовать dialogInterface.dismiss() на setPositiveButton лямбда-метод, но безуспешно. Есть идеи?

РЕДАКТИРОВАТЬ! решено!:)

Я переписал AuthLogic.logout ():

fun logout(context: Context) {
            val builder = AlertDialog.Builder(context)
            builder.setTitle(R.string.are_you_sure)
            builder.setMessage(R.string.confirm_msg_logout)
            builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->

                // logout logic ...
                dialogInterface.dismiss()
                context.startActivity(AuthActivity.newStartIntent(context))
                (context as Activity).finish()
            }
            builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
            builder.show()
        }

и удалил строку финиша (), видимую на * 1. Спасибо @Johan Kovalski за подсказку.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

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

yourAlertDialog.dimiss ();

0 голосов
/ 31 октября 2019

Диалог Window создается с действием Context. Activity должен очистить принадлежащие ему окна. Сначала вы должны уничтожить диалог, затем активность. Или используйте DialogFragment.

Журнал, который вы упомянули в вопросе, говорит о том, что действие не может быть должным образом уничтожено (как вы запросили с помощью finish()), потому что диалог все еще содержит ссылку на него.

...