HttpURLConnection не использует кеш на Android

1

Недавно я переключил свое приложение с помощью AndroidHTTPClient на использование HttpURLConnection. Я пытаюсь заставить работу HttpURLConnection кэшировать работать, и у меня нет успеха.

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

    URL url = new URL(currentURL);

    ResultAndUrl result = null;
    final HttpURLConnection httpUrlConnection = (HttpURLConnection) urll.openConnection();
    httpUrlConnection.setUseCaches(true);
    try {
        InputStream in = new BufferedInputStream(httpUrlConnection.getInputStream());
        result = new ResultAndUrl();
        result.result = convertStreamToString(in);
        result.url = currentURL;
    } catch (final Exception e) {
        try {
            Log.e("NETWORK", e.getMessage());
        } catch (Exception ee) {

        }
    } finally {
        try {
            httpUrlConnection.disconnect();
        } catch (Exception e) {
        }
    }

Также в моем классе приложения у меня есть

public void enableHttpResponseCache() {
    final long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    final File httpCacheDir = new File(getCacheDir(), "http");
    try {
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
        try{
            HttpResponseCache.install(httpCacheDir, httpCacheSize); // Library that implements HttpResponseCache for pre-ICS phones
        } catch(Exception e){
        }
    }
}

Однако даже для телефонов ICS нет кеш-хитов, когда-либо происходящих, и похоже, что кеширование вообще ничего не делает. Не могли бы вы сказать мне, что я делаю что-то неправильно или что-то не хватает?

  • 0
    почему вы изменили пакет реализации? если вы недовольны примерами из Google в предпочтительном для Google UrlConnection, посмотрите следующее: code.google.com/p/httpclientandroidlib hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/… Общие сведения идея заключается в том, что многопоточная реализация является масштабируемой / надежной и обычно используется разработчиками Android. Клиентская библиотека в первой ссылке хорошо поддерживается, работает хорошо. Итак, вместо шаблона кэша, рассмотрите пул потоков?
  • 1
    Как вы отслеживаете попадание в кеш? Посмотрите заголовки, которые ваш сервер отправляет вам. Сервер может запретить кэширование на определенных запросах.
Теги:
httpclient
httpresponse
network-protocols
httpurlconnection

1 ответ

1

http://pastebin.com/i60a90wv

Метод 'update' в приведенной выше ссылке представляет собой пример кода с использованием пула HTTP-потоков, https и http-сообщений. Таким образом, помимо предложения ссылок в приведенном выше комментарии, я также использовал их в android.

еще один код (исполняемый из класса HttpConnectionPost:

    public void run() {
//      Log.d(TAG, "run ENTRY instance"  +entry.toString());
        handler.sendMessage(Message.obtain(handler, HttpConnection.DID_START));
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 40 * 1000);
        HttpConnectionParams.setSoTimeout(params, 20 * 1000);
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

        httpClient = new DefaultHttpClient(MyConnectionManager.getInstance(), params);
//      HttpConnectionParams.setSoTimeout(httpClient.getParams(), 25000);
        httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
            public void process(
                    final HttpRequest request, 
                    final HttpContext context) throws HttpException, IOException {
                if (!request.containsHeader("Authorization")) {
                    request.addHeader("Authorization", "OAuth " +ClientCustomSSL.getInstance().getToken());
                }
            }

        }); 
        try {
            HttpResponse response = null;
            switch (method) {

            case POST:
                HttpPost httpPost = new HttpPost(url);
                if (data != null){
                    System.out.println(" post data not null ");
                    httpPost.setEntity(new StringEntity(data));
                }
                if (entry != null){
                    ContentProducer cp = new ContentProducer() {
                        public void writeTo(OutputStream outstream) throws IOException {

                             ExtensionProfile ep = new ExtensionProfile();
                             ep.addDeclarations(entry);
                             XmlWriter xmlWriter = new XmlWriter(new OutputStreamWriter(outstream, "UTF-8"));
                             entry.generate(xmlWriter, ep);
                             xmlWriter.flush();
                        }
                    };
                    httpPost.setEntity(new EntityTemplate(cp));
                }
                httpPost.addHeader("GData-Version", "2");
                httpPost.addHeader("X-HTTP-Method-Override", "PATCH");
                httpPost.addHeader("If-Match", "*");
                httpPost.addHeader("Content-Type", "application/xml");
                response = httpClient.execute(httpPost);

                break;
            }
            if (method < BITMAP)
                processEntity(response.getEntity());
        } catch (Exception e) {
            handler.sendMessage(Message.obtain(handler,
                    HttpConnection.DID_ERROR, e));
        }
        MyConnectionManager.getInstance().didComplete(this);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню