ПРАВОВАЯ ОГОВОРКА: Я настоятельно рекомендую читать ответ @BalusC. После чтения следующего учебного руководства по кэшированию: http://www.mnot.net/cache_docs/ (я рекомендую, Вы читаете его, также), я полагаю, что он корректен. Однако по историческим причинам (и потому что я протестировал его сам), я буду включать свой исходный ответ ниже:
я попробовал 'принятый' ответ за PHP, который не работал на меня. Тогда я провел немного исследования, нашел небольшой вариант, протестировал его, и это работало. Здесь это:
header('Cache-Control: no-store, private, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Expires: 0', false);
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');
, Который должен работать. Проблема состояла в том, что при установке той же части заголовка дважды, если эти false
не отправляется как второй аргумент функции заголовка, функция заголовка просто перезапишет предыдущее header()
вызов. Так, при установке эти Cache-Control
, например, если Вы не хотите помещать все аргументы в один header()
вызов функции, он должен сделать что-то вроде этого:
header('Cache-Control: this');
header('Cache-Control: and, this', false);
См. больше подробной документации здесь .
Вы можете использовать следующий код для загрузки изображения:
URLConnection connection = uri.toURL().openConnection();
connection.connect();
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024);
Bitmap bmp = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
Требуется следующее разрешение в AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Существует клиентская библиотека HTTP, которая может теперь поддерживаться в Android, но для любого мелкого control вы можете использовать URL и HttpURLConnection. код будет выглядеть примерно так:
URL connectURL = new URL(<your URL goes here>);
HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();
// do some setup
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("GET");
// connect and flush the request out
conn.connect();
conn.getOutputStream().flush();
// now fetch the results
String response = getResponse(conn);
где getResponse () выглядит примерно так, в вашем случае вы получаете обратно кучу двоичных данных, вы можете захотеть изменить StringBuffer на массив байтов и разбивайте чтение на больший приращение.
private String getResponseOrig(HttpURLConnection conn)
{
InputStream is = null;
try
{
is = conn.getInputStream();
// scoop up the reply from the server
int ch;
StringBuffer sb = new StringBuffer();
while( ( ch = is.read() ) != -1 ) {
sb.append( (char)ch );
}
return sb.toString();
}
catch(Exception e)
{
Log.e(TAG, "biffed it getting HTTPResponse");
}
finally
{
try {
if (is != null)
is.close();
} catch (Exception e) {}
}
return "";
}
Поскольку вы говорите о данных изображения, которые могут быть большими, вам нужно усердно относиться к другим вещам в Android, а именно: как можно скорее освободить память. у вас есть только 16 МБ кучи, с которой можно поиграть для всех приложений, и она быстро заканчивается, и сборщик мусора сведет вас с ума, если вы не очень хорошо разбираетесь в возврате ресурсов памяти