Android HttpResponseCache не работает - FileNotFoundException

У меня проблема с кэшированием ответов http(s) с веб-сервера в Android, документация плохая, поэтому я прошу помощи здесь. Вот мой код:

    String encodedString = String.format("jsonData=%s", URLEncoder.encode(json, "UTF-8"));

    URL urlConn = new URL(url+"?"+encodedString);

    HttpURLConnection cachedUrlConnection = (HttpURLConnection) urlConn.openConnection();
    cachedUrlConnection.setUseCaches(true);
    cachedUrlConnection.setDoInput(true);
    cachedUrlConnection.setDoOutput(true);
    cachedUrlConnection.setRequestProperty("charset", "utf-8");
    cachedUrlConnection.setRequestMethod("GET");

    cachedUrlConnection.addRequestProperty("Cache-Control", "only-if-cached");


    InputStream is = null;
    try {
        is = cachedUrlConnection.getInputStream();

        Log.i("_INFO","------CACHE FOUNDED");

    } catch (FileNotFoundException e){
        e.printStackTrace();

        HttpURLConnection nonCachedUrlConnection = (HttpURLConnection) urlConn.openConnection();
        nonCachedUrlConnection.setUseCaches(true);
        nonCachedUrlConnection.setDoInput(true);
        nonCachedUrlConnection.setDoOutput(true);
        nonCachedUrlConnection.setRequestProperty("charset", "utf-8");
        nonCachedUrlConnection.setRequestMethod("GET");
        nonCachedUrlConnection.addRequestProperty("Cache-Control", "max-stale=" + (60 * 60 * 24));

        Log.i("_INFO","-------CACHE NOT FOUNDED");

        is = nonCachedUrlConnection.getInputStream();
    }

Кроме того, я уже установил кэш в методе onCreate приложения следующим образом:

try {
        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
        File httpCacheDir = new File(getExternalCacheDir(), "http");
        Class.forName("android.net.http.HttpResponseCache")
                .getMethod("install", File.class, long.class)
                .invoke(null, httpCacheDir, httpCacheSize);

        Log.i("_INFO", "HttpResponseCache enabled");

    } catch (Exception httpResponseCacheNotAvailable) {
        Log.d("_INFO", "HTTP response cache is unavailable.");
    }

И если я печатаю размер кеша, то после перезапуска приложения он правильно печатает кеш размером 2 мб (поэтому он кешируется правильно). Я очищаю кеш после всех HTTP-вызовов следующим образом:

HttpResponseCache cache = HttpResponseCache.getInstalled();
        if(cache != null) {
            Log.i("_INFO", "CACHED FLUSHED WITH " + cache.size());
            cache.flush();
        }

Так что, в принципе, процесс кеширования работает отлично, НО я не могу получить кешированный ответ, когда получаю InInStStream. Мой logcat всегда печатал "CACHE NOT FOUNDED".

1 ответ

Решение

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

Только с:

cachedUrlConnection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);

этот, кеш работает очаровательно.

Другие вопросы по тегам