Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分页库最初返回空列表_Java_Android_Android Architecture Components_Android Jetpack_Android Paging - Fatal编程技术网

Java 分页库最初返回空列表

Java 分页库最初返回空列表,java,android,android-architecture-components,android-jetpack,android-paging,Java,Android,Android Architecture Components,Android Jetpack,Android Paging,我正在使用分页库对从服务器检索的项目列表进行分页。最初,当我的片段被加载时,它返回一个空列表。但是在更改片段并返回到该片段之后,我可以看到加载的列表。调试后,我看到数据实际上正在被提取,但一个空列表被传递给了我的片段 ItemDataSource: @Override public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer,

我正在使用分页库对从服务器检索的项目列表进行分页。最初,当我的片段被加载时,它返回一个空列表。但是在更改片段并返回到该片段之后,我可以看到加载的列表。调试后,我看到数据实际上正在被提取,但一个空列表被传递给了我的片段

ItemDataSource:

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, Item> callback) {
    apiService.getItems(OFFSET)
    .enqueue(new Callback<ItemWrapper>() {
        @Override
        public void onResponse(@NonNull Call<ItemWrapper> call,@NonNull Response<ItemWrapper> response) {
            callback.onResult(response.body().getItems(), null, OFFSET + 25);
        }

        @Override
        public void onFailure(@NonNull Call<ItemWrapper> call,@NonNull Throwable t) {
            t.printStackTrace();
        }
    });
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Item> callback) {

}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Item> callback) {
    apiService.getItems(params.key)
            .enqueue(new Callback<ItemWrapper>() {
                @Override
                public void onResponse(@NonNull Call<ItemWrapper> call,@NonNull Response<ItemWrapper> response) {
                    Integer key = response.body().getItems().isEmpty() ? null : params.key + 25;
                    callback.onResult(response.body().getItems(), key);
                }

                @Override
                public void onFailure(@NonNull Call<ItemWrapper> call,@NonNull Throwable t) {
                    t.printStackTrace();
                }
            });
}
@Override
public DataSource create() {
    ItemDataSource itemDataSource = new ItemDataSource();
    itemLiveDataSource.postValue(itemDataSource);
    return itemDataSource;
}

public MutableLiveData<ItemDataSource> getItemLiveDataSource() {
    return itemLiveDataSource;
}
private LiveData<ItemDataSource> liveDataSource;
private LiveData<PagedList<Item>> itemPagedList;

private ItemViewModel(Application application) {
    ItemDataSourceFactory factory = new ItemDataSourceFactory();
    liveDataSource = factory.getItemLiveDataSource();

    PagedList.Config config = (new PagedList.Config.Builder())
                .setEnablePlaceholders(false)
                .setPageSize(ItemDataSource.LIMIT).build();

    itemPagedList = (new LivePagedListBuilder(factory, config)).build();
}

public LiveData<PagedList<Item>> getItems() {
    return itemPagedList;
}
ItemViewModel itemViewModel = ViewModelProviders.of(this).get(ItemViewModel.class);
itemViewModel.getItems.observe(this, items -> {
    adapter.submitList(items);
})

我也曾经遇到过这个问题,但我仍然不明白为什么它对某些片段不起作用。我发现的解决方案是,aldo更像是一个快速的粗略修复,加载两次片段

不是100%确定,但我认为这是因为您正在运行一个异步请求。尝试将其更改为同步运行
loadInitial()
,例如
request.execute()

Yassin Ajdi是正确的
loadinitial()
在创建页面列表的同一线程上立即调用。由于您的API是异步的,如果像我一样,有人在
loadInitial
中使用异步RxJava/Kotlin调用,那么该方法将第一次空运行。经过几个小时的痛苦,我终于找到了解决办法

我尝试在
Observer
方法中使用延迟处理程序(500ms),但它变化无常,不能在所有场景中都起作用。无论我如何尝试使用
setFetcher
和Rx
observeOn
使其同步,它都不会一直工作

我的解决方案是在Observable中使用
.blockingSubscribe
。我的数据获取程序使用的是一个套接字库,它自身的并发性超出了我的范围,因此我无法保证能够按照分页要求使进程完全同步。(这是一个需要更好的文件记录的过程)。无论如何,我的解决方案是这样的,希望它能帮助其他人解决同样的问题:

    override fun loadInitial(
            params: LoadInitialParams<Int>,
            callback: LoadInitialCallback<Int, ResultItem>
    ) {
       mySocketClientRxRequest()
                .subscribe ({
                    callback.onResult(it.resultItems 1, 2)
                },{
                    it.printStackTrace()
                })
    }
override-fun-loadInitial(
params:LoadInitialParams,
回调:LoadInitialCallback
) {
mySocketClientRxRequest()
.订阅({
callback.onResult(it.resultItems 1,2)
},{
it.printStackTrace()
})
}

override-fun-loadInitial(
params:LoadInitialParams,
回调:LoadInitialCallback
) {
mySocketClientRxRequest()
.阻止订阅({
callback.onResult(it.resultItems 1,2)
},{
it.printStackTrace()
})
}

请添加适配器#submitList()的代码好吗?也许这只是一些琐碎的事情,比如不做任何改变。您还应该尝试调试以查看数据的传输距离,因为正如您所写的,数据是从服务器获取的。@Ridcully我正在使用PagedListAdapter预定义的
submitList()
方法。我没有推翻它。你能解决这个问题吗?另外,如果你能分享对你有用的东西,那也太好了。@ABS我从头重写了整个代码,它开始工作了。但我无法准确指出问题出在哪里。这应该是一个异步请求!你根本不能用这个来取消请求approach@Kibotu你们也可以争辩说,我不应该在生产中使用阻塞rx调用,但这就是它,它是第2页库中一个基本缺陷的解决方法。虽然出于兴趣,但您希望什么样的取消?假设您有一个搜索,其中必须对每个字母进行无效处理,那么如果用户键入,您对大多数请求都不感兴趣。旁注:阻塞是正常的,因为我们已经通过分页库在arcio线程上了,不好的部分是,即使设置了自己的Executor,空列表部分仍然存在
    override fun loadInitial(
            params: LoadInitialParams<Int>,
            callback: LoadInitialCallback<Int, ResultItem>
    ) {
       mySocketClientRxRequest()
                .blockingSubscribe ({
                    callback.onResult(it.resultItems 1, 2)
                },{
                    it.printStackTrace()
                })
    }