Как пройти мимо заголовка Retrofit и полевых карт с библиотекой подкачки - PullRequest
0 голосов
/ 07 июня 2018

Итак, я искал новую библиотеку подкачки на android.Он имеет различные компоненты, которые вам нужно реализовать, чтобы он работал.Допустим, я хочу использовать API с модернизацией и бесконечно прокручивать обновления страниц.Как лучше всего передать карты заголовков или полей в Retrofit, учитывая все, что вам нужно реализовать (ViewModel, репозиторий, источник данных и т. Д.)?https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample

Ответы [ 2 ]

0 голосов
/ 09 августа 2018

Модернизация не имеет ничего общего с 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 .

А для изучения Retrofit и Building APIs Iопубликовали полную серию на YouTube.Вы можете проверить Руководство по модернизации Android .

0 голосов
/ 02 июля 2018

Поскольку вы разместили образец PagingWithNetworkSample, использующий API Reddit, в этом примере ваши аннотации поля модификации могут быть эквивалентны этому файлу:

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

Ваша модификацияЗаголовок, вероятно, также помещается в этот файл.

В классе 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

Так что, если под «лучшим способом передачи карт заголовка или поля в дооснащение» вы подразумеваете, каким способом вы передаете значения заголовка и поля вМодернизация, в этом примере это будет из функций в SubredditBoundaryCallback, вызывающих getTop и getTopAfter (причем эти значения, возможно, передаются в SubredditBoundaryCallback откуда-то еще).

...