0

我尝试在我的项目中使用分页。不幸的是,它不像我预期的那样工作。我预计liveDataObserver将在callBack.onResult之后工作。但实际上,当loadInitial完成时,liveDataObserver 会立即观察。callBack稍后工作,并没有向观察者发布数据。

代码:首先我写了一个类扩展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;
}

并覆盖 loadInitial:

@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();
    }
}

那么datasourceFactory就是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 中写了subscribeOnobserveOn
  • viewModel 是一个 scopeProvider,因为我使用的是 autoDispose

我在 github 中尝试了一些示例。看来,pageLivedata 的 setValue 在 loadInitial 之后始终有效。在这种情况下,我该如何使用single

4

1 回答 1

1

好像解决了

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

因此,我更新了 callAdapter,我在其中为单人编写了 subscribeOn 和 observeOn。当它是Page 类时按className 过滤,它不会做subscribeOn 和observeOn。

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

于 2018-10-16T06:02:46.847 回答