Как работать с изображением с помощью URL в андроиде?

ПРАВОВАЯ ОГОВОРКА: Я настоятельно рекомендую читать ответ @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);

См. больше подробной документации здесь .

5
задан Hisham Muneer 30 October 2012 в 16:42
поделиться

2 ответа

Вы можете использовать следующий код для загрузки изображения:

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" />
5
ответ дан 18 December 2019 в 07:31
поделиться

Существует клиентская библиотека 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 МБ кучи, с которой можно поиграть для всех приложений, и она быстро заканчивается, и сборщик мусора сведет вас с ума, если вы не очень хорошо разбираетесь в возврате ресурсов памяти

5
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: