初识OKhttp框架(下)线程通讯

线程通讯

因为OKhttp是不能在UI线程中执行的,所以每一次网络请求都需要新建一个线程,可是新建线程后,在子线程里想要更新UI界面怎么办呢?就用到了这么一个知识点,线程通讯。

子线程传给UI线程的方式

NO.1 Handler
 new Thread(new Runnable(){

            @Override
            public void run() {
                //需要数据传递
                Message msg =new Message();
                //可以是基本类型,可以是对象,可以是List、map等;
                msg.obj = "数据";
                mHandler.sendMessage(msg);
            }

        }).start();

这是你新建的线程,可以在里面进行想要的不能再UI线程里面进行的操作,如网络请求。然后将获得数据传入Message的对象里,通过sendMessage方法传出。

  Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.i("tag", "handleMessage: "+msg.obj);
        }

    };

这是你写的Handler,一般定义在主线程中,如果是多个类中间的交互,需要传content,实现handleMessage方法,获得Message的对象,得到刚才传入里面的数据,然后就可以更新UI线程了。

NO.2 runOnUiThread方法
  getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        imageView.setImageBitmap(bitmap); 
                                    }
                                });

这是runOnUiThread方法,看名字就能看出来,“运行在UI的线程”这个可以用来更新UI,也只能用来更新UI,不是Handeler那样可以子线程间通讯,不过如果只更新UI线程很方便。因为这个方法属于Activity对象,所以前面一般连一个getActivity(),也可根据自己情况修改。

NO.3 View.post(Runnable r)
imageView.post(new Runnable(){  

                    @Override  
                    public void run() {  
                        imageView.setImageBitmap(bitmap);  
                    }  

                });  

如果上一种还可以将数据传给UI线程,这个的局限性就更大了,这个只能更新View控件,不过也更方便,上面一个还需要找content对象,这个直接可以根据控件修改。

这次主要讲的一般的三种线程通讯方式,这是一般常用的,根据你需要的,去选择你用的,还有很多通讯方式,都是接下来慢慢会学的,等接触到就会写下笔记来。现在先到这里吧,小鸟的进阶之路是不停的。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值