Вытащить изображения из Интернета - PullRequest
1 голос
/ 23 сентября 2010

Я использую следующий код для загрузки изображений из Интернета. Он использует Gridview и в зависимости от позиции выбирает URL из массива. Это работает, но при загрузке изображений часто происходит попадание или пропуск. Почти каждый раз, когда я запускаю приложение, загружается разное количество изображений.

У него также есть проблемы при переходе с портретного на альбомный вид, могут отображаться 5 из 10 изображений, после чего я включаю устройство и обычно теряю все изображения. Иногда, правда, некоторые появляются.

Есть идеи, как сделать это более надежным?

try {
                    URLConnection conn = aURL.openConnection();
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    Bitmap bm = BitmapFactory.decodeStream(bis);
                    bis.close();
                    return bm;
            } catch (IOException e) {
                    Log.d("DEBUGTAG", "error...");
            }
            return null;

1 Ответ

1 голос
/ 23 сентября 2010

Одна вещь, которую я прочитал, - это известная ошибка с декодированием растровых изображений из InputStream, и предлагаемое исправление от Google состояло в том, чтобы использовать FlushedInputStream (пример в URL ниже):

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

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

public static Bitmap loadImageFromUri(URI uri)
    {   
        URL url;
        try {
            url = uri.toURL(); 
        } catch (MalformedURLException e) {
            Log.v("URL Exception", "MalformedURLException");
            return null;
        }

        try
        {           
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            return BitmapFactory.decodeStream(new FlushedInputStream(input));
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return null;
        }
    }

Я просто передаю URI из-за способа, которым я настроил остальную часть моего кода, вы могли бы вместо этого передать URL и пропустить первыйчасть.Это предотвратит загрузку вашего потока пользовательского интерфейса.

...