LiveData: Невозможно вызвать ObforveForever в фоновом потоке после рефакторинга AndroidX.

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

 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 на самом деле не выполняет никакой загрузки, вы можете указать библиотеке Paging использовать исполнителя, оборачивающего поток UI/Main:

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() метод)