LiveData:AndroidX 重构后无法在后台线程上调用 observeForever

LiveData: Cannot invoke observeForever on a background thread after AndroidX refactor

重构为 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,我想知道为什么这会在 LifeData 的 2.0.0 版(AndroidX 重构)中中断。 这是一个错误吗?有什么方法可以让它再次起作用吗?

看起来你对 AndroidX 的重构更新了你需要在主线程上观察的 LiveData 版本。如果您更新到最新的 LiveData 之前的 Androidx 版本 1.1.1,您也会看到这个。

观察 LiveData 无法在 UI 线程之外完成,但取决于您正在做什么,这可能没问题。如果您的 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() 方法)