开发错误记录1:解决:Only the original thread that created a view hierarchy can touch its views.

今天在项目中要使用圆角头像,导入开源 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 == nullreturn;
            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 == nullreturn;
    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开发,要碰到很多定制过的系统,有时会遇到有些品牌机可以正常运行,有些不能!

耗时,网络请求操作一定要单独开线程操作,这样就能减少不同机型兼容的问题!

原文地址:https://www.cnblogs.com/ut2016-progam/p/5261363.html