Проверьте, получает ли Volley результаты из кеша или по сети.

Как я могу проверить, получает ли Volley результаты JsonObjectRequest из кеша или из сети?

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

мой запрос выглядит примерно так

volleyQueue = Volley.newRequestQueue(this);
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>(){...stuff}, new Response.ErrorListener(){...errorstuff});
jr.setShouldCache(true);
volleyQueue.add(jr);

person dumazy    schedule 14.11.2013    source источник


Ответы (5)


Я сделал это, переопределив Request#addMarker и проверив добавление маркера «кэш-попадания»:

public class MyRequest<T> extends Request<T> {

    protected boolean cacheHit;

    @Override
    public void addMarker(String tag) {
        super.addMarker(tag);
        cacheHit = false;
        if (tag.equals("cache-hit")){
            cacheHit = true;
        }
    }
}
person tkelly    schedule 09.01.2014
comment
Не станет ли он снова нулевым, когда после маркера попадания в кеш будет добавлен другой маркер? Через много времени после Cache-hit Queue вызывает addMarker, который переопределяет флаг cacheHit. - person NinjaCoder; 25.09.2015
comment
@tkelly, у меня проблема: stackoverflow.com/questions/36678289/, как ваше решение? Как я могу использовать этот маркер? - person MSepehr; 18.04.2016

Перед выполнением запроса вы можете получить кеш из очереди запросов и проверить, не является ли запись нулевой.

mRequestQueue.getCache().get("key");

Ключом для каждого запроса обычно является URL. Я думаю, вам следует проверить, не истек ли срок действия записи.

person Emanuel Canha    schedule 21.01.2014
comment
Возможно, вам также следует проверить, что срок действия записи не истек, есть метод isExpired. Я думаю, что Volley не удаляет записи по истечении срока их действия. - person androidguy; 08.02.2017

В Volley есть встроенный способ узнать, являются ли запросы image немедленными через класс ImageContainer, но похоже, что у него нет аналогичного механизма для других запросов, таких как запрос объекта JSON.

Кажется, у вас есть 2 основных варианта:

  1. Вы можете установить таймер примерно на 300 мс после запроса JSON (проверить лучшее время). Когда таймер завершится, проверьте, есть ли у вас уже результат, в противном случае покажите диалоговое окно. Я знаю, что это немного "взломать", но это может быть достаточно хорошо.
  2. Отредактируйте код Volley, чтобы добавить флаг isImmediate к каждому запросу. Есть несколько способов добиться этого. Я предлагаю начать с CacheDispatcher
person Itai Hanski    schedule 14.11.2013

Начиная с ответа Тима Келли.

к тому времени, когда вы проверите «cacheHit», он будет возвращен к false, и вы не будете знать, что это попадание в кеш, потому что многие другие теги получены после получения «cacheHit» и до вызова «onResponse».

Итак, добавьте

if(tag.equals("network-http-complete")){
            cacheHit = false;
        }

и удалить cacheHit = false;

person a fair player    schedule 13.04.2014

adb shell setprop log.tag.Volley VERBOSE

Запустите эту команду в своем терминале, вам может потребоваться установить «adb» в вашем пути, чтобы использовать эту команду, она должна находиться в вашем каталоге sdk/platform-tools/.

Это обеспечит гораздо более подробные журналы залпа и покажет что-то вроде строк стека выполнения для запроса залпа, который показывает попадания или промахи кэша.

person user3703478    schedule 03.06.2014