Android-пейджинг работает не так, как ожидалось - PullRequest
0 голосов
/ 16 октября 2018

Я пытался использовать пейджинг в своем проекте.К сожалению, это работает не так, как я ожидал.Я ожидал, что liveDataObserver будет работать после callBack.onResult . Но на самом деле liveDataObserver наблюдает сразу же после завершения loadInitial . 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:

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

Возможно связанные вещи:

  • Я написал subscribeOn и наблюдаем в модифицированном callAdapter
  • ViewModel является scopeProvider, так как я использую autoDispose

Я попробовал какой-нибудь пример в github.И, похоже, setValue для pageLivedata всегда работает после loadInitial.В этом случае, как я могу использовать single ?

1 Ответ

0 голосов
/ 16 октября 2018

Кажется, это решено.

Ошибка в том, что запланируйте поток, используя rxjava.Это позволяет одному источнику данных работать в разных потоках.В этом случае обратный вызов onResult запускается после наблюдателя.

Итак, я обновил callAdapter, где я написал подписку на подписку и наблюдал за одиночной.Фильтруйте по className, когда это класс Page, он не будет выполнять подписку и наблюдение.

Теперь вывод таков: пусть пейджинг обрабатывает поток.

...