Расширения Kotlin для Android: java.lang.IllegalStateException: представление не должно быть нулевым - PullRequest
0 голосов
/ 22 января 2019

Я использую привязку представления kotlin в моем фрагменте. В некоторых случаях происходит сбой приложения с IllegalStateException и представление как нулевое, я обращаюсь к нему в исполняемом файле, который вызывается с помощью обработчика с задержкой в ​​1,5 секунды.

 numberRunnable = Runnable {
        if (mobileView.text.toString().isNotEmpty() && Utility.isMobileNumberValid(mobileView.text.toString())) {
            presenter.getCustomerDetails(Utility.getServerAcceptableContactNumber(mobileView.text.toString()))
        }
    }

mobileView равно нулю

Код обработчика: handler.postDelayed(numberRunnable, 1500)

Мне известна одна возможность проверить, присутствует ли isAdded в моем фрагменте, но, поскольку я не могу воспроизвести ошибку, я не уверен, что это проблема.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Действие, вероятно, выполняется после того, как пользователь покидает фрагмент и вызывается onDestroy().В этом состоянии во фрагменте не будет экземпляров View.

Простой обходной путь - создать глобальную переменную для проверки состояния, созданного вашим фрагментом.Установите значение true в onViewCreated() и false в onDestroyView() (до супер звонка).Затем проверьте это значение внутри Runnable перед выполнением вашей логики.

Лучшее решение (хотя это зависит от условий гонки и требует, чтобы каждый Runnable был назначен глобальной переменной), может использовать метод Handler.removeCallbacks() ипередать все ваши Runnables.

override fun onDestroyView() {
    handler.removeCallbacks(numberRunnable)
}

Еще одна возможность - просто сказать, что представление обнуляемо:

mobileView?.let {
    //Your stuff goes in here
    //You can reference mobileView using "it"
}
0 голосов
/ 22 января 2019

Вы не можете предполагать, что после 1.5 с представления все еще присоединяются к иерархии представлений.

Добавьте handler.removeCallbacks(numberRunnable) к вашему onStop() обратному вызову жизненного цикла, чтобы удалить numberRunnable, когда фрагмент больше не активен.

Также задайте себе вопрос, почему вам нужна задержка.

...