4

AndroidのリストビューでURLから画像を読み込もうとしています。私はそれを行うために以下のコードを使用しています。

        Bitmap bm;
        try {
            URL url = new URL(imageUrl);
            bm = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        imageView.setImageBitmap(bm);

上記のコードを AsyncTask で実行しています。実行すると正しく表示されます。しかし、別のアクティビティに移動して戻ってきた後、画像が表示されません。その時、私のログキャットは、

W/System.err(3570): java.io.IOException: BufferedInputStream is closed
W/System.err(3570):     at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:116)
W/System.err(3570):     at java.io.BufferedInputStream.read(BufferedInputStream.java:274)
W/System.err(3570):     at org.apache.harmony.luni.internal.net.www.protocol.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:40)
W/System.err(3570):     at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:166)
W/System.err(3570):     at java.io.BufferedInputStream.read(BufferedInputStream.java:324)
W/System.err(3570):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
W/System.err(3570):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573)
W/System.err(3570):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:628)
W/System.err(3570):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
W/System.err(3570):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
W/System.err(3570):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
W/System.err(3570):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
W/System.err(3570):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
W/System.err(3570):     at java.lang.Thread.run(Thread.java:1019)

実際には以下の行にエラーが表示されていますが、

bm = BitmapFactory.decodeStream(url.openConnection().getInputStream());

SOでこれに関連するさまざまな投稿を検索して見つけましたが、解決策が見つかりませんでした...誰か助けてくれますか?

4

4 に答える 4

2

Google の Jess による次の回避策を試してください。

修正するコード:

/**
 * This input stream won't read() after the underlying stream is exhausted.
 * http://code.google.com/p/android/issues/detail?id=14562
 */
final class DoneHandlerInputStream extends FilterInputStream {
    private boolean done;

    public DoneHandlerInputStream(InputStream stream) {
        super(stream);
    }

    @Override public int read(byte[] bytes, int offset, int count) throws IOException {
        if (!done) {
            int result = super.read(bytes, offset, count);
            if (result != -1) {
                return result;
            }
        }
        done = true;
        return -1;
    }
}

使用するには、getInputStream() から返されたストリームを DoneHandlerInputStream にラップします。

   InputStream stream = url.openConnection().getInputStream();
   stream = new DoneHandlerInputStream(stream);

   bm = BitmapFactory.decodeStream(stream);
   //rest of your code

完全な説明を参照してください: http://code.google.com/p/android/issues/detail?id=14562

于 2013-04-26T14:34:43.673 に答える
0
    try {
        is = conn.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        bm = BitmapFactory.decodeStream(bis);
            is.close();//add
        conn.disconnect();//add
    } catch (IOException e) {
        e.printStackTrace();
    }
于 2013-03-11T15:17:46.143 に答える
0

試す

URL url = new URL(url);
private Bitmap getBitmap(String url) {  

try {

    Bitmap bm = null;

    bm = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    return bitmap;

} catch (Exception e) {
    Log.e("Error", e.getMessage());
    e.printStackTrace();
   }

}
imageView.setImageBitmap(getBitmap.url);
于 2013-03-11T14:00:10.083 に答える