今天在项目中要使用圆角头像,导入开源 CircleImageView ,然后setImageBitmap()时
运行时就会发现,它会报一个致命性的异常::
· ERROR/AndroidRuntime(421): FATAL EXCEPTION: Thread-8
· ERROR/AndroidRuntime(421): android.view.ViewRoot$CalledFromWrongThreadException:
· Only the original thread that created a view hierarchy can touch its views.
原因在于,Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。检查代码发现是在ui线程中调用的呀!后换成系统控件ImageView,一切正常,这是咋个回事?原代码:
public void setAvatar(final String imgurl) { if (imgurl == null || user == null) return; try { URL url = new URL(imgurl); user.setImageBitmap(BitmapFactory.decodeStream(url.openStream()); } catch (Exception e) { e.printStackTrace(); } } }).start();}
后发现处理网络请求时,要用单独线程,把代码更成如下:
private Bitmap bm = null;public void setAvatar(final String imgurl) { if (imgurl == null || user == null) return; new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(imgurl); bm=BitmapFactory.decodeStream(url.openStream()); } catch (Exception e) { e.printStackTrace(); } activity.runOnUiThread(new Runnable() { @Override public void run() { user.setImageBitmap(bm); } }); } }).start();}
因为android开发,要碰到很多定制过的系统,有时会遇到有些品牌机可以正常运行,有些不能!
耗时,网络请求操作一定要单独开线程操作,这样就能减少不同机型兼容的问题!