Как реализовать пользовательское кэширование в Retrofit (только для определенных методов) - PullRequest
0 голосов
/ 15 мая 2018

Мне интересно, есть ли способ настроить конкретные запросы при модернизации, тогда как остальные остаются не кешируемыми.Вероятно, используя пользовательскую аннотацию:

@Cacheable
@GET("/user")
Call<UserResponse> getUser(@Path("id") String id);

Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете инициировать модификацию, как показано ниже для кэшированного запроса и не кэшированного запроса

Для кеширования

    public static Retrofit initializeRetrofit(Context mContext) {
        OkHttpClient client = new OkHttpClient();
        final File baseDir = mContext.getCacheDir();
        if (baseDir != null) {
            final File cacheDir = new File(baseDir, "HttpResponseCache");
            client.setCache(new Cache(cacheDir, 10 * 1024 * 1024));
        }

        //Setting time out for okHTTP
        client.setConnectTimeout(60, TimeUnit.SECONDS); // connect timeout
        client.setReadTimeout(60, TimeUnit.SECONDS);
        client.setRetryOnConnectionFailure(true);

        /**
         * For Logging in retrofit
         */
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        client.interceptors().add(interceptor);

        return new Retrofit.Builder()
                .baseUrl(Constants.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }

Для не кеширования

    public static Retrofit initializeRetrofitWithoutCache(Context mContext) {
        OkHttpClient client = new OkHttpClient();

        //Setting time out for okHTTP
        client.setConnectTimeout(60, TimeUnit.SECONDS); // connect timeout
        client.setReadTimeout(60, TimeUnit.SECONDS);
        client.setRetryOnConnectionFailure(true);

        /**
         * For Logging in retrofit
         */
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        client.interceptors().add(interceptor);

        return new Retrofit.Builder()
                .baseUrl(Constants.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }

Используйте эти функции для инициализацииRetrofit перед выполнением сетевого вызова, используйте эти функции, как требуется в вашей функции вызова API

Вы можете сделать что-то подобное, чтобы вызвать ваше обновление

Для звонков с кешем

Call<ResponseBody> call = initializeRetrofit()
                .create(RetrofitInterface.class)
                .yourFunction(params...);

для звонков без кеша

Call<ResponseBody> call = initializeRetrofitWithoutCache()
                .create(RetrofitInterface.class)
                .yourFunction(params...);

Вы также можете создать обертку над ней, где вы можете определить свои маршруты и флаг, чтобы проверить, требуется ли кэширование или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...