BitmapFactory.decodeStream (InputStream is) возвращает ноль для не нулевого InputStream на Android - PullRequest
5 голосов
/ 09 мая 2011

Я разрабатываю приложение для Android, и его представление содержит несколько галерей.Содержание галерей (растровых изображений) красного цвета из Интернета.

Для первой галереи все работает нормально, но при попытке загрузить первое изображение второй галереи BitmapFactory.decodeStream(InputStream) возвращает ноль, а поток НЕ равен нулю.

public void loadBitmap() throws IOException {

        for (int i = 0; i < images.size(); ++i) {
            URL ulrn = new URL(images.get(i).getThumbUrl());
            HttpURLConnection con = (HttpURLConnection) ulrn.openConnection();
            InputStream is = con.getInputStream();
            images.get(i).setImage(BitmapFactory.decodeStream(is));
            Log.i("MY_TAG", "Height: " + images.get(i).getImage().getHeight());
        }
}

getThumbUrl() возвращает URL-адрес изображения (например, http://mydomain.com/image.jpg) и выбрасывает NullPointerException в строке Log.i("MY_TAG", "Height: ... ) (images - это ArrayList, содержащий объекты моего класса, который содержитURL и растровое изображение тоже).

Спасибо за любой совет!

Ответы [ 3 ]

7 голосов
/ 09 мая 2011

Я столкнулся с этим.Попробуйте использовать BufferedHttpEntity с вашим входным потоком.Я обнаружил, что это предотвратило 99,9% проблем с получением молчаливых нулей от decodeStream.

Возможно, не имеет значения, но я надежно использую org.apache.http.client.HttpClient вместо HttpURLConnection, как в:

public static Bitmap decodeFromUrl(HttpClient client, URL url, Config bitmapCOnfig)
{
    HttpResponse response=null;
    Bitmap b=null;
    InputStream instream=null;

    BitmapFactory.Options decodeOptions = new BitmapFactory.Options();
    decodeOptions.inPreferredConfig = bitmapCOnfig;
    try
    {
    HttpGet request = new HttpGet(url.toURI());
        response = client.execute(request);
        if (response.getStatusLine().getStatusCode() != 200)
        {
            MyLogger.w("Bad response on " + url.toString());
            MyLogger.w ("http response: " + response.getStatusLine().toString());
            return null;
        }
        BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(response.getEntity());
        instream = bufHttpEntity.getContent();

        return BitmapFactory.decodeStream(instream, null, decodeOptions);
    }
    catch (Exception ex)
    {
        MyLogger.e("error decoding bitmap from:" + url, ex);
        if (response != null)
        {
            MyLogger.e("http status: " + response.getStatusLine().getStatusCode());
        }
        return null;
    }
    finally
    {
        if (instream != null)
        {
            try {
                instream.close();
            } catch (IOException e) {
                MyLogger.e("error closing stream", e);
            }
        }
    }
}
1 голос
/ 06 октября 2011

Google привел меня сюда. Для всех, у кого такая же проблема:

Проблема: http://code.google.com/p/android/issues/detail?id=6066

Решение ("FlushedInputStream"): http://android -developers.blogspot.com / 2010/07 / многопоточность-для-performance.html

0 голосов
/ 09 мая 2011
public static Bitmap decodeStream (InputStream is)

Возвращает

Декодированное растровое изображение, или ноль, если данные изображения не могут быть декодированы.

Вы проверяли, что не получаете некоторыеОшибка 404 или аналог вместо изображения?

...