【问题标题】:loadAfter() in Android paging library infinitely loading the first page from APIAndroid分页库中的loadAfter()从API无限加载第一页
【发布时间】:2021-11-10 12:58:15
【问题描述】:

我正在我的 Android 应用中实现分页库 2.1.2,我的 DataSource 类看起来像这样

public class TransactionsDataSource extends PageKeyedDataSource<Integer, Items> {


private static final int FIRST_PAGE = 1;
private Context context;
private Repository repository;
private String bearerToken;
private int merchantId;


public TransactionsDataSource(Context context, int merchantId) {
    this.context = context;
    this.merchantId = merchantId;
    repository = new Repository();
    repository.initLoginSharedPref(context);
    bearerToken = repository.getAccessToken();
}


@Override
public void loadInitial(@NonNull PageKeyedDataSource.LoadInitialParams<Integer> params, @NonNull PageKeyedDataSource.LoadInitialCallback<Integer, Items> callback) {


    ApiClient.getApiClient().getApiInterface().getMerchantTransactions(bearerToken,
            merchantId, FIRST_PAGE)
            .enqueue(new Callback<MainResponse>() {
                @Override
                public void onResponse(Call<MainResponse> call, Response<MainResponse> response) {
                    if (response.body() != null){

                        int code = response.body().getCode();
                        if (code == SERVER_OK_CODE){
                            callback.onResult(response.body().getData().getItems(), null, FIRST_PAGE + 1);
                        } else if (code == SERVER_UNAUTHENTICATED_CODE){

                            repository.clearCache();
                            HelperMethods.signOut(context);
                        } else {
                            //no more data to load
                        }


                    }
                }

                @Override
                public void onFailure(Call<MainResponse> call, Throwable t) {

                }
            });
}

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

}

@Override
public void loadAfter(@NonNull PageKeyedDataSource.LoadParams<Integer> params, @NonNull PageKeyedDataSource.LoadCallback<Integer, Items> callback) {


    ApiClient.getApiClient().getApiInterface().getMerchantTransactions(bearerToken,
            merchantId, params.key)
            .enqueue(new Callback<MainResponse>() {
                @Override
                public void onResponse(Call<MainResponse> call, Response<MainResponse> response) {
                    if (response.body() != null){

                        int code = response.body().getCode();
                        if (code == SERVER_OK_CODE){

                            Integer key = params.key + 1;
                            callback.onResult(response.body().getData().getItems(), key);

                        } else if (code == SERVER_UNAUTHENTICATED_CODE){

                            repository.clearCache();
                            HelperMethods.signOut(context);
                        } else {
                            //no more data to load
                        }

                    }
                }

                @Override
                public void onFailure(Call<MainResponse> call, Throwable t) {

                }
            });
}

}

据我所知,loadInitial() 方法负责加载第一页数据,然后将触发 loadAfter() 以加载其余页面,同时键递增 1 直到没有更多数据要加载。但是当我调试应用程序时,即使我确保将 params.key() 增加 1,loadAfter() 也会不断重复加载第一页。我什至尝试将页码硬编码如下,但仍然加载第一页只有

ApiClient.getApiClient().getApiInterface().getMerchantTransactions(bearerToken,
        merchantId, 2)

我需要知道发生了什么以及如何修复此错误?

【问题讨论】:

  • 出于好奇,您是否有任何理由使用分页 2.x API?在最新的稳定版分页中,大部分 api 表面已被弃用。
  • 我还想问一下,您能否发布一下您发出的 HTTP 调用和返回的响应是什么?如果您请求的页面不存在,您的后端是否有可能返回上一页?例如,只有一页数据?我在您的代码中立即看到的一个问题是您永远不会终止(将 null 传递给 nextKey)到 PageKeyedDataSource.LoadCallback
  • @dlam 让我向您澄清一下,1- 在调试期间,我确保 loadAfter 从 API 调用第一页,而在 PostMan 上,API 工作正常。 2-你说我的代码永远不会终止,这是不正确的,因为有一个 if 条件,我检查 if (code == SERVER_UNAUTHENTICATED_CODE) 这意味着响应携带新数据,否则它将终止
  • 我的意思是,您应该通过为 nextKey 返回 null 来与 paging 交流该页面是终端(最后一页),否则它将继续尝试朝该方向加载。

标签: java android retrofit2 android-paging android-paging-library


【解决方案1】:

虽然我的实现是 100% 正确的,并且在我尝试了这么多事情之后,我终于找到了解决这种奇怪行为的方法。我在界面中做了一个小改动,而不是将页码传递给 getMerchantTransactions() 我决定将整个 url 作为参数发送,它工作正常 这是我更新后界面中的方法

@POST
@FormUrlEncoded
Call<MainResponse> getMerchantTransactions(@Header("Authorization") String bearerToken,
                                           @Field("id") int merchantId,
                                           @Url String url);

然后像这样在loadInitial()和loadAfter()中调用这个方法

ApiClient.getApiClient().getApiInterface().getMerchantTransactions(bearerToken,
            merchantId, "myUrl?pagenumber=" + params.key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2014-10-24
    • 2021-08-23
    • 2020-12-14
    • 2016-03-12
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多