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 !! 是什么原因以及如何避免或克服这个问题?
mcv*_*eat 15
我今天偶然发现了同样的问题.并且找到了答案,幸运的是:) SDK中存在一个错误,在谷歌群组线程中或多或少地描述.
对我有用的解决方法是:
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);
}
Run Code Online (Sandbox Code Playgroud)
并确保不要将缓冲区大小设置为超过8k,因为操作系统将使用默认大小而不是您设置的大小(当然记录,但我花了一段时间才注意到;)).
| 归档时间: |
|
| 查看次数: |
6556 次 |
| 最近记录: |