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

Убедитесь, что волейбол получает результаты из кеша или по сети

Как я могу проверить, получает ли 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);
4b9b3361

Ответ 1

Я сделал это, переопределив Request # addMarker и проверив добавление маркера "cache-hit":

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;
        }
    }
}

Ответ 2

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

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

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

Ответ 3

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

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

  • Вы можете установить таймер на что-то вроде 300 мс после запроса JSON (тест на лучшее время). Когда таймер будет выполнен, проверьте, есть ли у вас результат, иначе отобразите диалог. Я знаю, что это немного "взломать", но это может быть достаточно хорошо.
  • Отредактируйте код Volley, чтобы добавить флаг isImmediate для каждого запроса. Существует несколько способов достижения этого. Предлагаю начать с CacheDispatcher

Ответ 4

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

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

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

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

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

Ответ 5

adb shell setprop log.tag.Volley VERBOSE

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

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