所以,我正在研究android的新分页库。它具有您需要实现的不同组件才能使其工作。假设我想通过改造来访问一个 API,并通过分页更新无休止地滚动。考虑到您需要实现的所有内容(ViewModel、存储库、数据源等),将 Header 或 Field 映射传递给 Retrofit 的最佳方式是什么? https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample
2 回答
Retrofit 与 PagingLibrary 无关,您将处理您之前处理的改造。如果您想发送带有改造的 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 Field 注释可能与此文件等效:
您的 Retrofit Header 也可能会进入该文件。
在 RedditApi 类中,getTop 和 getTopAfter 等函数从应用程序的其他部分调用。例如从这里 -
因此,如果“将 Header 或 Field 映射传递给 Retrofit 的最佳方式”是指将 Header 和 Field 值传递给 Retrofit 的方式,在本例中,它将来自调用 getTop 和 getTopAfter 的 SubredditBoundaryCallback 中的函数(使用那些值可能从其他地方传递到 SubredditBoundaryCallback)。