public class TestButton extends Activity { /** Called when the activity is first created. */ ImageButton imgBtn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imgBtn = (ImageButton) findViewById(R.id.image); //String url = "http://thenextweb.com/apps/files/2010/03/google_logo.jpg"; String url1 = "http://trueslant.com/michaelshermer/files/2010/03/evil-google.jpg"; Drawable drawable = LoadImage(url1); imgBtn.setImageDrawable(drawable); } private Drawable LoadImage(String url) { try { InputStream is = (InputStream) new URL(url).getContent(); Drawable d = Drawable.createFromStream(is, "src"); return d; } catch (Exception e) { return null; } } }
上面是我用来将图像从web加载到ImageButton的代码片段。大多数图像都会显示出来,但是某些网址就像上面的那个网址,即url1,Drawable.createFromStream会返回null!是什么原因以及如何避免或解决这个问题?
答案 0 :(得分:14)
我今天偶然发现了同样的问题。并找到答案,幸运的是:)有一个bug in SDK, described more or less on that google groups thread。
对我有用的解决方法是:
private static final int BUFFER_IO_SIZE = 8000;
private Bitmap loadImageFromUrl(final String url) {
try {
// Addresses bug in SDK :
// http://groups.google.com/group/android-developers/browse_thread/thread/4ed17d7e48899b26/
BufferedInputStream bis = new BufferedInputStream(new URL(url).openStream(), BUFFER_IO_SIZE);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(baos, BUFFER_IO_SIZE);
copy(bis, bos);
bos.flush();
return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size());
} catch (IOException e) {
// handle it properly
}
}
private void copy(final InputStream bis, final OutputStream baos) throws IOException {
byte[] buf = new byte[256];
int l;
while ((l = bis.read(buf)) >= 0) baos.write(buf, 0, l);
}
并确保不要将缓冲区大小设置为超过8k,因为操作系统将使用默认大小而不是您设置的大小(当然记录了,但我花了一些时间才注意到;))。
答案 1 :(得分:0)
另一个解决方案是使用FlushedInputStream http://code.google.com/p/android/issues/detail?id=6066