如何在改造中处理分页

我正在build立一个应用程序使用改造。 一切都很顺利,但我担心我的API请求的大小,并希望分页使用分页。

使用Retrofit自动翻页API的最佳策略是什么?所有可用的数据都是默认下载的?

Related of "如何在改造中处理分页"

首先,分页需要由您使用的后端服务来支持。 其次,如果你正在寻找一个如何从客户端使用改造来实现这个例子,我build议你看看@JakeWharton的u2020项目。 GalleryService改造界面以非常简单的方式实现了这种机制。 这是一个到接口本身的链接 。

这是一个基于u2020项目的简单例子

// See how it uses a pagination index. public interface GalleryService { @GET("/gallery/{page}") // Gallery listGallery(@Path("page") int page); } 

通过跟踪已经从rest服务下载的项目总量以及每页预定义的最大项目数,您可以计算必要的页面索引,以便为下一组要下载的项目调用您的rest服务。

然后你可以打电话给你rest这样的API。

 int nextPage = totalItemsAlreadyDownloaded / ITEMS_PER_PAGE + 1; restApi.listGallery(nextPage); 

这是一个非常简单的例子,基于u2020项目,但希望它给你一个如何攻击这个想法。

所以我最终解决了这个问题:

我在我的服务器上使用Grape,所以我安装了Grape-kaminari gem来处理分页服务器端。 Grape-kaminari在您的url上提供页面查询,并将方便的分页信息添加到页眉响应中。

我写了一个小课程,让我自动recursion通过页面,直到我已经消耗了API上的所有数据:

 package com.farmgeek.agricountantdemo.app.helpers; import android.util.Log; import retrofit.client.Header; import retrofit.client.Response; public class APIHelper { public static PaginationData getPaginationData(Response response) { int currentPage = 1; int totalPages = 1; for (Header header : response.getHeaders()) { try { if (header.getName().equals("X-Page")) { currentPage = Integer.parseInt(header.getValue()); } else if (header.getName().equals("X-Total-Pages")) { totalPages = Integer.parseInt(header.getValue()); } } catch (NullPointerException e) { // We don't care about header items // with empty names, so just skip over // them. Log.w("APIHelper -> getPaginationData", "Skipped over header: " + e.getLocalizedMessage()); } } return new PaginationData(currentPage, totalPages); } public static class PaginationData { public final int page; public final int total; public PaginationData(int currentPage, int totalPages) { this.page = currentPage; this.total = totalPages; } } } 

然后我会在我的API调用中使用它,如下所示:

 public void getStuff(int page) { final RestAdapter restAdapter = buildRestAdapter(); // Tell the sync adapter something's been added to the queue ApiService apiService = restAdapter.create(ApiService.class); apiService.getStuff(page, new Callback<List<Stuff>>() { @Override public void success(final List<Stuff> stuffList, Response response) { final APIHelper.PaginationData pagination = APIHelper.getPaginationData(response); for (final Stuff stuff : stuffList) { handleRecord(stuff); } if (pagination.page == pagination.total) { App.getEventBus().postSticky(new StuffSyncEvent()); App.getEventBus().post(new SuccessfulSyncEvent(Stuff.class)); } else { // Otherwise pull down the next page new StuffSyncRequestAdapter().getStuff(pagination.page+1); } } @Override public void failure(RetrofitError error) { String errorMessage = error.getCause().getMessage(); App.getEventBus().post(new UnsuccessfulSyncEvent(Stuff.class, errorMessage)); } }); }