4

我正嘗試從android中的listview中的url中加載圖像。我使用下面的一段代碼來做到這一點。java.io.IOException:BufferedInputStream已關閉

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

我已經搜索並找到因此與此不同的職位,但找不到任何解決方案... 任何人都可以幫我嗎?

回答

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

嘗試這種解決方法由傑西來自谷歌:

代碼來解決:

/** 
* 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

0

你可能會訪問一個HTTP 小號端點與HTTP URL