Android-пейджинг работает не так, как ожидалось
Я пытался использовать пейджинг в моем проекте. К сожалению, это работает не так, как я ожидал. Я ожидал, что 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 является просто newInstanced в 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);
});
Может быть, связанные вещи:
- Я написал подписку и наблюдаю в модернизированном callAdapter
- ViewModel является scopeProvider, так как я использую autoDispose
Я попробовал некоторый пример в github. И, похоже, setValue для pageLivedata всегда работает после loadInitial. В этом случае, как я могу использовать один?
1 ответ
Это кажется решенным.
Ошибка в том, что запланируйте поток, используя rxjava. Это позволяет одному источнику данных работать в разных потоках. В этом случае обратный вызов onResult запускается после наблюдателя.
Итак, я обновил callAdapter, где я написал подписку и наблюдаю за одиночкой. Фильтруйте по className, когда это класс Page, он не будет выполнять подписку и наблюдение.
Теперь вывод таков: пусть пейджинг обрабатывает поток.