Android-представление kotlin bind IllegalStateException не должно быть нулевым - PullRequest
0 голосов
/ 06 октября 2019

У меня есть приложение для Android, которое выпущено в магазине Play Store.

Когда я проверял отчеты о сбоях, я видел что-то странное.

import kotlinx.android.synthetic.main.fragment_item.*

class ItemFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_item, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        presenter.getItem(args.item)
    }

    override fun onItemLoaded(item: Item) {
        tvDesc.text = item.desc // in here: Exception occurrs
    }
}

И ниже мой класс докладчика:

class ItemPresenter(
        private val view: ItemContract.View,
        private val itemsRepository: ItemsRepository,
        private val ioScheduler: Scheduler = Schedulers.io(),
        private val uiScheduler: Scheduler = AndroidSchedulers.mainThread(),
        private val disposable: CompositeDisposable = CompositeDisposable()
) : ItemContract.Presenter {

    override fun getItem(name: String) {
        disposable.add(
            itemsRepository.getItem(name)
                .subscribeOn(ioScheduler)
                .observeOn(uiScheduler)
                .subscribe {
                    view.onItemLoaded(it)
                }
        )
    }

}

Когда я запускаю на телефоне, он работает нормально. Но согласно сообщениям о сбоях, на нескольких устройствах отображаются исключения IllegalStateExceptions.

Почему?

Следует ли использовать привязку старого стиля? как "findViewById"

1 Ответ

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

Моя теория:

Ваш ведущий вызывается во время onViewCreated вашего фрагмента. Но процесс получения элемента асинхронный, поэтому, пока это происходит, фрагмент можно быстро отсоединить / остановить / приостановить / и т. Д. и, следовательно, находиться в незаконном состоянии, чтобы получать обновления. Трудно сказать без контекста, доступа к проекту и тщательной отладки, но часто возникает проблема перезвонить фрагменту, состояние которого недопустимо.

Существуют различные способы смягчения, контроля и предотвращения этих проблем. Среди них - просто использовать LiveData или даже сделать докладчик Lifecycle Aware, и не вызывать view.onItemLoaded(it), если жизненный цикл фрагмента "по крайней мере" запущен.

Я не знаю, есть ли у вашего докладчика onStop / Destroy / и т.д. это останавливает / удаляет подписку в вашем составном пуле одноразовых принадлежностей, но если фрагмент не готов к получению запрошенного ответа, тогда фрагмент должен сообщить докладчику, что он больше не готов к получению этого и что его следует отбросить / остановить/и т.д. Если вы используете Lifecycle / Livedata, это обрабатывается вами, при условии, что вы подключите все необходимое для его работы.

Я предлагаю рассмотреть различные Jetpack компоненты, предлагаемые Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...