Frage BitmapFactory.decodeStream (InputStream ist) gibt null für nicht null InputStream auf Android zurück


Ich entwickle eine Android-Anwendung, und ihre Ansicht enthält mehrere Gallerys. Der Inhalt der Gallerys (die Bitmaps) ist rot aus dem Internet.

Für die erste Galerie funktioniert alles gut, aber beim Versuch, das erste Bild der zweiten Galerie herunterzuladen, ist die BitmapFactory.decodeStream(InputStream) gibt null zurück, während der Stream NICHT null ist.

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());
        }
}

Das getThumbUrl() gibt die URL des Bildes zurück (z. B. http://mydomain.com/image.jpg) und es wirft ein NullPointerException an der Linie Log.i("MY_TAG", "Height: ... ) (images ist ein ArrayList enthält Objekte meiner Klasse, die auch die URL und die Bitmap enthalten).

Danke für jeden Hinweis!


5
2018-05-09 17:41


Ursprung


Antworten:


Ich bin darauf gestoßen. Verwenden Sie BufferedHttpEntity mit Ihrem Eingabestream. Ich habe festgestellt, dass dies 99,9% der Probleme mit stillen Nullen von decodeStream verhindert.

Vielleicht nicht signfikant, aber ich verwende org.apache.http.client.HttpClient und nicht HttpURLConnection wie in:

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);
            }
        }
    }
}

7
2018-05-09 19:26



Google hat mich hierher gebracht. Für alle, die das gleiche Problem haben:

Problem: http://code.google.com/p/android/issues/detail?id=6066

Lösung ("FlushedInputStream"): http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html


1
2017-10-06 08:06



public static Bitmap decodeStream (InputStream is)

Kehrt zurück

Die decodierte Bitmap, oder null, wenn die Bilddaten nicht decodiert werden konnten.

Hast du überprüft, dass du keinen 404-Fehler oder ähnliches anstelle des Bildes bekommst?


-1
2018-05-09 18:58