Android中的CreateFromStream为某些url返回null
Posted
技术标签:
【中文标题】Android中的CreateFromStream为某些url返回null【英文标题】:CreateFromStream in Android returning null for certain url 【发布时间】:2011-06-03 20:01:43 【问题描述】: 公共类 TestButton 扩展 Activity /** 在第一次创建活动时调用。 */ 图像按钮 imgBtn; @覆盖 公共无效 onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); 设置内容视图(R.layout.main); imgBtn = (ImageButton) findViewById(R.id.image); //字符串 url = "http://thenextweb.com/apps/files/2010/03/google_logo.jpg"; 字符串 url1 = "http://trueslant.com/michaelshermer/files/2010/03/evil-google.jpg"; Drawable drawable = LoadImage(url1); imgBtn.setImageDrawable(drawable); 私人可绘制加载图像(字符串网址) 尝试 InputStream = (InputStream) new URL(url).getContent(); Drawable d = Drawable.createFromStream(is, "src"); 返回 d; 捕捉(异常 e) 返回空值;上面是我用来将图像从网络加载到 ImageButton 的代码 sn-p。大多数图像都会显示,但某些 url 像上面的那样,即 url1,Drawable.createFromStream 返回 null !是什么原因以及如何避免或克服这个问题?
【问题讨论】:
【参考方案1】:我今天偶然发现了同样的问题。并找到了答案,幸运的是:)有一个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,因为操作系统将使用默认大小而不是您设置的大小(当然会记录它,但我花了一段时间才注意到这一点;))。
【讨论】:
Android 1.0 版本中存在该错误,2.x 版本中是否仍然存在?在我的测试中似乎是这样,但我正在寻找谷歌的官方确认。另外,在您的代码中,您将 BUFFER_IO_SIZE 设置为什么? @ThomasW 无法确定。我可以确定的两件事是它具有相同的行为,并且在 2.1 和 2.2 中,它在模拟器和设备上都对我有用。我将更新我的答案以包含 BUFFER_IO_SIZE 值。 你,我的男人,是个天才。节省了我大量的时间来寻找这个!我很惊讶这个错误仍然存在。无论如何,谢谢你!使用位图比使用可绘制更有效吗? 如果在复制方法中将缓冲区大小设置为BUFFER_IO_SIZE
,则不再需要BufferedOutputStream
,因为它会尝试自动填充自己的缓冲区【参考方案2】:
另一种解决方案是使用 FlushedInputStream http://code.google.com/p/android/issues/detail?id=6066
【讨论】:
以上是关于Android中的CreateFromStream为某些url返回null的主要内容,如果未能解决你的问题,请参考以下文章
android中的java.lang.OutOfMemoryError,同时从android中的画廊获取图像