LiveData: Невозможно вызвать ObforForever в фоновом потоке после рефакторинга AndroidX. - PullRequest
0 голосов
/ 11 октября 2018

После рефакторинга в androidx (через AndroidStudio) мой PageKeyedDataSource из Libar 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 Ответ

0 голосов
/ 11 октября 2018

Похоже, ваш рефакторинг для 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);
    }
};

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

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

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

...