user2545386
user2545386

Reputation: 457

Android paging works not as expected

I tried to use paging in my project. Unfortunately, it works not as I expected. I expected that the liveDataObserver will work after callBack.onResult.But in fact, the liveDataObserver observes immediately when the loadInitial finished.The callBack works later, and didn't post data to the observer.

The code: First I wrote a class extend PageKeyedDataSource and interface SingleCreator

public class MyPagingDataSource<T> extends PageKeyedDataSource<Integer, T>

public interface SingleCreator<T> {
    SingleSubscribeProxy<Page<T>> createSingle(int page, int pageSize);
}

Then the constructor of MyPagingDataSource:

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

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

Then the datasourceFactory is just newInstanced in viewModel:

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

the single

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

at fragment

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

Maybe related things:

I tried some example in github. And it seems, the setValue for pageLivedata is always work after loadInitial. In this case, how can I use single?

Upvotes: 0

Views: 390

Answers (1)

user2545386
user2545386

Reputation: 457

It's seems solved.

The error is because schedule the thread using rxjava. It makes single and datasource work in different thread. In this case, callback onResult run after the observer.

So, I updated the callAdapter where I wrote subscribeOn and observeOn for single. Filter by className when It's Page class, it won't do subscribeOn and observeOn.

Now the conclusion is, let paging handle the thread.

Upvotes: 1

Related Questions