android.view.ViewRoot$CalledFromWrongThreadException 异常的解决方案Activity类runOnUiThread方法

在android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常,android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views. (只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)。)。

一般的做法是用handler机制,在子线程发一个Message个ui线程,然后线程获取message的数据更新ui控件数据。

这里着重要介绍的是第二个方案。就是activity的runOnUiThread(Runnable runnable)方法;要使用这个方法必须往子线程中传递activity引用context,和要更新的UI控件引用。
然后在子线程中实现更新逻辑,然后这个更新代码被加入到ui线程队列等待UI线程执行。

activity.runOnUiThread(new Runnable() {

    @Override
    public void run() {
                            // TODO Auto-generated method stub
                            imageView.setImageBitmap(bitmap);
                        }
                    });

//根据下载url,下载图片更新imageview控件的工具类。
//传进去的参数有下载路径url,activity引用,imageview控件引用
    public static void setPicBitmap(final String url, final Activity activity,
            final ImageView imageView) {

        new Thread() {

            @Override
            public void run() {

                try {

                    HttpURLConnection connection = (HttpURLConnection) new URL(
                            url).openConnection();
                    connection.connect();
                    InputStream iStream = connection.getInputStream();

                    final Bitmap bitmap = BitmapFactory.decodeStream(iStream);
                    // pic.setImageBitmap(bitmap);
                    activity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            imageView.setImageBitmap(bitmap);
                        }
                    });
                    iStream.close();

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }.start();

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值