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