LiveData: невозможно вызвать наблюдениеForever в фоновом потоке после рефакторинга AndroidX

После рефакторинга в androidx (через AndroidStudio) мой PageKeyedDataSource из библиотеки разбиения на страницы ломается из-за этой ошибки:

 java.lang.IllegalStateException: Cannot invoke observeForever on a background thread

Код:

class TransactionDataSource(val uid: String, groupIdLiveData: LiveData<GroupNameIdPair>, var groupId: String) : PageKeyedDataSource<DocumentSnapshot, Transaction>() {
[...]
    init {
                val observer: Observer<GroupNameIdPair> = {
                    invalidate()
                    groupId = it.id

                }
                groupIdLiveData.observeNotNull(observer)
        }
[...]

Поскольку PageKeyedDataSource по умолчанию выполняется в фоновом режиме и полагается на LiveData, мне интересно, почему это ломается в версии 2.0.0 LifeData (рефакторинг AndroidX). Является ли это ошибкой и есть ли способ заставить ее снова работать?




Ответы (1)


Похоже, ваш рефакторинг для AndroidX обновил вас до версии LiveData, которая требует наблюдения в основном потоке. Вы также увидите это, если обновитесь до последней версии LiveData до Androidx, 1.1.1.

Наблюдение за LiveData невозможно выполнить вне потока пользовательского интерфейса, но в зависимости от того, что вы делаете, это может быть хорошо. Если ваш DataSource на самом деле не выполняет никакой загрузки, вы можете указать библиотеке пейджинга использовать исполнителя, обертывающего пользовательский интерфейс/основной поток:

static Executor MainExecutor = new Executor() {
    Handler handler = new Handler(Looper.getMainLooper());
    @Override
    public void execute(Runnable runnable) {
        handler.post(runnable);
    }
};

и передайте его в библиотеку пейджинга (при условии, что вы используете LiveData<PagedList>)

LivePagedListBuilder.create(myFactory, myConfig)
        //...
        .setFetchExecutor(MainExecutor)
        .build();

(Если вы используете RxPagedListBuilder, есть аналогичный метод setFetchScheduler())

person Chris Craik    schedule 11.10.2018