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()
方法)
重构为 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()
方法)