所以,我正在研究 android 的新 分页库 。它具有不同的组件,您需要实现这些组件才能使其工作。假设我想使用一个 API 进行改造并通过分页更新无休止地滚动。考虑到您需要实现的所有内容(ViewModel、存储库、数据源等),将标头或字段映射传递到 Retrofit 的最佳方法是什么? https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample
Retrofit 与 PagingLibrary 无关,您将处理之前处理过的 Retrofit。 如果您想发送带有改造的 BasicAuth 标头,那么这里有一个代码。
package net.simplifiedcoding.retrofitandroidtutorial.api;
import android.util.Base64;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static final String AUTH = "Basic " + Base64.encodeToString(("belalkhan:123456").getBytes(), Base64.NO_WRAP);
private static final String BASE_URL = "http://simplifiedlabs.xyz/MyApi/public/";
private static RetrofitClient mInstance;
private Retrofit retrofit;
private RetrofitClient() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(
new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", AUTH)
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
}
).build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
public static synchronized RetrofitClient getInstance() {
if (mInstance == null) {
mInstance = new RetrofitClient();
}
return mInstance;
}
public Api getApi() {
return retrofit.create(Api.class);
}
}
上面的代码将为您将进行的每个改造调用添加相同的标头。
您将在 loadInitials()、loadBefore() 和 loadAfter() 等方法中使用相同的东西来获取所需的页面。
例如下面是我的Retrofit API接口。
public interface Api {
@GET("answers")
Call<StackApiResponse> getAnswers(@Query("page") int page, @Query("pagesize") int pagesize, @Query("site") String site);
}
这里我有一个调用方法,它采用页码、页面大小等参数来获取数据。
与在分页方法中调用它的方式相同。示例如下:
//this will be called once to load the initial data
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<Integer, Item> callback) {
RetrofitClient.getInstance()
.getApi().getAnswers(FIRST_PAGE, PAGE_SIZE, SITE_NAME)
.enqueue(new Callback<StackApiResponse>() {
@Override
public void onResponse(Call<StackApiResponse> call, Response<StackApiResponse> response) {
if (response.body() != null) {
callback.onResult(response.body().items, null, FIRST_PAGE + 1);
}
}
@Override
public void onFailure(Call<StackApiResponse> call, Throwable t) {
}
});
}
我希望这有帮助。如果您想要逐步说明如何使用 Android 分页库和 PageKeyedDataSource,请按照此 Android 分页库教程。
为了了解改造和构建 API,我在 youtube 上发布了完整的系列。您可以查看Retrofit Android 教程。
当您发布使用 Reddit API 的 PagingWithNetworkSample 时,在该示例中,您的 Retrofit 字段注释可能与此文件等效:
您的改造标头也可能会进入该文件。
在 RedditApi 类中,从应用程序的其他部分调用 getTop 和 getTopAfter 等函数。 例如从这里 -
因此,如果“将标头或字段映射到 Retrofit 的最佳方式”是指将标头和字段值传递给 Retrofit 的最佳方式,在本例中,它将来自 SubredditBoundaryCallback 中调用 getTop 和 getTopAfter 的函数(使用这些值可能从其他地方传递到 SubredditBoundaryCallback 中)。