2

所以,我正在研究android的新分页库。它具有您需要实现的不同组件才能使其工作。假设我想通过改造来访问一个 API,并通过分页更新无休止地滚动。考虑到您需要实现的所有内容(ViewModel、存储库、数据源等),将 Header 或 Field 映射传递给 Retrofit 的最佳方式是什么? https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample

4

2 回答 2

1

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 教程

于 2018-08-09T05:50:28.737 回答
0

当您发布使用 Reddit API 的 PagingWithNetworkSample 时,在该示例中,您的 Retrofit Field 注释可能与此文件等效:

https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/api/RedditApi.kt

您的 Retrofit Header 也可能会进入该文件。

在 RedditApi 类中,getTop 和 getTopAfter 等函数从应用程序的其他部分调用。例如从这里 -

https://github.com/googlesamples/android-architecture-components/blob/d81da2cb1e3d61e40f052e631bb15883d0f9f637/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/repository/inDb/SubredditBoundaryCallback.kt# L54

因此,如果“将 Header 或 Field 映射传递给 Retrofit 的最佳方式”是指将 Header 和 Field 值传递给 Retrofit 的方式,在本例中,它将来自调用 getTop 和 getTopAfter 的 SubredditBoundaryCallback 中的函数(使用那些值可能从其他地方传递到 SubredditBoundaryCallback)。

于 2018-07-02T05:37:21.753 回答