【问题标题】:java.io.IOException: BufferedInputStream is closedjava.io.IOException:BufferedInputStream 已关闭
【发布时间】:2013-02-26 16:56:10
【问题描述】:

我正在尝试在 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 中执行上述代码。当我执行时,它显示正确。但是在我转移到另一个活动并回来之后,图像没有显示。当时我的logcat显示,

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 中搜索并找到了与此相关的不同帖子,但找不到任何解决方案... 谁能帮帮我?

【问题讨论】:

    标签: android android-listview android-asynctask android-imageview android-image


    【解决方案1】:

    试试 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

    【讨论】:

      【解决方案2】:

      试试

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

      【讨论】:

        【解决方案3】:
            try {
                is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bm = BitmapFactory.decodeStream(bis);
                    is.close();//add
                conn.disconnect();//add
            } catch (IOException e) {
                e.printStackTrace();
            }
        

        【讨论】:

          【解决方案4】:

          您可能正在使用 http url

          访问 https 端点

          【讨论】:

            猜你喜欢
            • 2019-02-22
            • 2012-12-24
            • 2016-07-26
            • 2012-08-13
            • 2017-10-15
            • 1970-01-01
            • 1970-01-01
            • 2015-08-08
            • 2013-04-26
            相关资源
            最近更新 更多