Android 分页工作方式不符合预期



我尝试在我的项目中使用分页。不幸的是,它不像我预期的那样工作。我预计liveDataObserver将在callBack.onResult之后工作。但事实上,liveDataObserver 会在loadInitial结束时立即观察。回调稍后工作,并且不会将数据发布到观察者。

代码: 首先我写了一个类扩展PageKeyedDataSource和接口SingleCreator

public class MyPagingDataSource<T> extends PageKeyedDataSource<Integer, T>
public interface SingleCreator<T> {
SingleSubscribeProxy<Page<T>> createSingle(int page, int pageSize);
}

然后是MyPagingDataSource的构造函数:

public MyPagingDataSource(SingleCreator<T> singleCreator) {
this.singleCreator = singleCreator;
}

并覆盖加载初始:

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, T> callback) {
singleCreator.createSingle(1, params.requestedLoadSize)
.subscribe(new SingleObserver<Page<T>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(Page<T> ts) {
callback.onResult(ts.list, ts.pageNumber, ts.total, ts.pageNumber - 1, ts.pageNumber + 1);
Timber.d("registerLiveData" + ts.list.size());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});
try {
//when I add this, observer will work after callback
//And if not observer works before callback.onResult
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

然后数据源工厂只是 viewModel 中的 newInstanced:

public LiveData<PagedList<MyData>> page = loadPageData();
public LiveData<PagedList<MyData>> loadPageData() {
return new LivePagedListBuilder<>(new DataSource.Factory<Integer, MyData>() {
@Override
public DataSource<Integer, MyData> create() {
return new HBPagingDataSource<>((page, pageSize) -> loadPageSingle(page, pageSize));
}
}, 2).build();
}

单曲

private SingleSubscribeProxy<Page<MyData>> loadPageSingle(int pageNum, int pageSize) {
return mModel.loadMyDates(pageNum, pageSize)
.doOnError(Throwable::printStackTrace)
.as(autoDisposable(this));
}

片段

mViewModel.page.observe(this, myDatas -> {
Timber.d("registerLiveData%s", myDatas.size());
myAdapter.submitList(myDatas);
});

也许相关的事情:

  • 我在改造的 callAdapter 中写了订阅和观察
  • 视图模型是一个范围提供程序,因为我正在使用自动处置

我在github中尝试了一些例子。看起来,pageLivedata 的 setValue 总是在 loadInitial. 之后工作。在这种情况下,我如何使用单?

似乎已经解决了。

该错误是因为使用 rxjava 调度线程。 它使单个和数据源在不同的线程中工作。 在这种情况下,回调 onResult 在观察者之后运行。

因此,我更新了 callAdapter,我在其中编写了 subscribeOn 并为单曲观察。 当它是页面类时按类名过滤,它不会做订阅和观察。

现在的结论是,让分页处理线程。

最新更新