Проверете дали 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 и проверих за добавен маркер "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;
        }
    }
}
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 ms, след като поискате 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/ dir.

Това ще предостави много по-подробни регистрационни файлове за залпове и ще покаже нещо подобно на стека за изпълнение за заявка за залпове, която показва кеширани удари или пропуски.

person user3703478    schedule 03.06.2014