Подтвердить что ты не робот

Как настроить Http-кеш при использовании Volley с помощью OkHttp?

Я хочу попытаться объединить Volley с OkHttp, но система кэша Volley и OkHttp, как полагаться на HTTP-кеш, как определено в спецификации HTTP. Итак, как можно отключить кеш OkHttp для хранения одной копии HTTP-кеша?

РЕДАКТИРОВАТЬ: что я сделал

public class VolleyUtil {
    // http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/
    private volatile static RequestQueue sRequestQueue;

    /** get the single instance of RequestQueue **/
    public static RequestQueue getQueue(Context context) {
        if (sRequestQueue == null) {
            synchronized (VolleyUtil.class) {
                if (sRequestQueue == null) {
                    OkHttpClient client = new OkHttpClient();
                    client.networkInterceptors().add(new StethoInterceptor());
                    client.setCache(null);
                    sRequestQueue = Volley.newRequestQueue(context.getApplicationContext(), new OkHttpStack(client));
                    VolleyLog.DEBUG = true;
                }
            }
        }
        return sRequestQueue;
    }
}

На какой OkHttpClient ссылаются https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750

4b9b3361

Ответ 1

OkHttp - это своего рода HTTP-клиент, такой как HttpUrlConnection, который реализует HTTP-кеш, мы можем отключить кеш OkHttp, как показано ниже:

OkHttpClient client = new OkHttpClient();
client.setCache(null);

Затем мы можем сохранить одну копию кэша HTTP, поддерживаемую Volley.

Улучшено:

Я бы хотел ответить на вопросы Sotti.

1 Я хотел бы знать, что такое хорошая настройка кеша при использовании Volley и OkHttp.

В моем проекте я использую один экземпляр Volley requestQueue для всех остальных API-интерфейсов, а OkHttp работал как транспортный уровень для Volley, как показано ниже.

public class VolleyUtil {
// http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/
private volatile static RequestQueue sRequestQueue;

/** get the single instance of RequestQueue **/
public static RequestQueue getQueue(Context context) {
    if (sRequestQueue == null) {
        synchronized (VolleyUtil.class) {
            if (sRequestQueue == null) {
                OkHttpClient client = new OkHttpClient();
                client.setCache(null);
                sRequestQueue = Volley.newRequestQueue(context.getApplicationContext(), new OkHttpStack(client));
                VolleyLog.DEBUG = true;
            }
        }
    }
    return sRequestQueue;
}}

2 Должны ли мы полагаться на Volley или на кеш OkHttp?

Да, я использую кеш Volley для своего HTTP-кэша вместо OkHttp Cache; Это отлично работает для меня.

3 Что такое поведение по умолчанию из коробки?

Для Volley:

он автоматически создаст для вас каталог кэша по умолчанию "volley".

/** Default on-disk cache directory. */
private static final String DEFAULT_CACHE_DIR = "volley";


public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) {
    File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
    ……
}

Для OkHttp:

Я не могу найти кеш по умолчанию в исходном коде, и мы можем установить кеш ответов, как этот пост http://blog.denevell.org/android-okhttp-retrofit-using-cache.html

4. Какое рекомендуемое поведение и как его достичь?

Как это сообщение говорит:

Volley заботится о запросе, загрузке, кешировании, потоковой передаче, синхронизации и многом другом. Он готов работать с JSON, изображениями, кэшированием, сырым текстом и допускать некоторые настройки.

Я предпочитаю использовать HTTP-кеш Volley из-за простоты настройки.

Например, мы можем иметь гораздо больший контроль над кешем, подобным этому Кэширование Android Volley + JSONObjectRequest.

Ответ 2

Изящный способ игнорировать кеш OkHttp:

request.setCacheControl(CacheControl.FORCE_NETWORK);