Есть ли способ очистить кеш InputStream - PullRequest
0 голосов
/ 18 декабря 2018

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

При отладке этой простой строки кода:

InputStream inputStream = new URL(srcURL).openStream();

Я обнаружил, что входной поток по-прежнему возвращает старую версию носителя.даже если доступ к тому же srcURL через браузер дает новую версию изображения.

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

Использует ли inputStream какой-то тип кеша памяти?Можете ли вы сказать мне, что мы здесь делаем неправильно?

Заранее спасибо.

1 Ответ

0 голосов
/ 18 декабря 2018

Я считаю, что код, который вы используете, будет работать правильно, , если соответствующие HTTP-заголовки установлены на стороне сервера (т. Е. LastModified, ETag, Cache-Control и т. Д.),

В любом случае код, который вы используете:

InputStream inputStream = new URL(srcURL).openStream();

... является сокращением для:

URLConnection connection = new URL(srcURL).openConnection();
InputStream inputStream = connection.getInputStream();

Вы можете использовать экземпляр URLConnection для управления кэшированием,используя метод setUseCache(boolean), до , вызывая getInputStream():

URLConnection connection = new URL(srcURL).openConnection();
connection.setUseCache(false);
InputStream inputStream = connection.getInputStream();

Для HTTP / HTTPS это должно быть эквивалентно установке значения заголовка Cache-Control: no-cache в запросе, что вызываетСервер с хорошим поведением отправит вам самую последнюю версию ресурса.

Вы также можете сделать это, используя метод URConnection.setRequestProperty(key, value), который является более общим способом установки заголовков HTTP.Конечно, вы можете установить здесь и другие HTTP-заголовки, например If-None-Match или If-Modified-Since.Опять же, все заголовки должны быть установлены до , вызывая getInputStream().

URLConnection connection = new URL(srcURL).openConnection();
connection.setRequestProperty("Cache-Control", "no-cache"); // Set general HTTP header
InputStream inputStream = connection.getInputStream();
...