android 线程消息处理【之消息处理中再处理的个人学习小思考】

android 工程中只有两类线程:ui线程和非ui线程。

ui线程是用来处理ui界面更新,非ui线程是用来处理一些耗时的服务,因为ui线程如果界面卡死20s,会报anr错误。当然这一切,目的这是要把这线程的分类概念让开发者彻底接受,并理解。

那么ui线程,和非ui线程,必然存在通信,非ui执行出结果,再消息推送致ui线程,ui线程处理接收到的结果,有可能更新ui。

这种消息机制的传递就是:handler+looper

handler 用来处理,looper用来存消息,它有消息队列。 一个线程都允许有且只有一个looper,一个handler【所以也可以没有】,至于handler是哪个线程的,它所依赖的looper决定。若构造函数无参,则依赖当前线程。自己线程的handler处理自己线程的消息队列中的消息。

message 是消息,它是一个结构体数据,它有what,when,arg1,arg2,obj 等属性。他的构造函数是无参的【new Message()】,但是通常情况下用handler.obtainMessage()。为什么呢?看源码:


  public  final  Message obtainMessage()
    {
        return  Message.obtain( this );//this指的就是调用时‘.’前面的那个对象,其实就是handler罗。所以这一层已经实现了target
    }

public  static  Message obtain(Handler h) {
       Message m = obtain();
       m.target = h;
 
       return  m;
   }

 public static Message obtain() {//这一层也就是最根本的,message是怎么来的。白话版就是:消息池有消息就取出来,给新对象赋值,没有
        synchronized (sPoolSync) {//就new 一个。所以这个函数对 new Message()是一种包含关系。如果消息池有货,就可以省了开辟空间了
            if (sPool != null) {
                Message m = sPool;//看到没有这有个同步函数呢。。。。因为是多线程,为了不想这个逻辑行为,在具体多步执行时不被打断,就用同
                sPool = m.next;//步实现原子性,但是同步嵌套的太多,就会造成死锁哦。。。
                m.next = null;
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
---------------------------------------华丽分割线--------------------------------------------------
接下来谈消息队列:消息队列,在ui线程即主线程是默认开辟的,如果你新建的线程,则要自己开辟。用的时候,别忘了加 looper.looper(),这个保证消息队列一直是活的。message 通过绑定target,发送到对应的target,并被target.handlemessage(Message msg)处理,这点很好理解。但是我想: 新建一个线程,创建该线程下的handler,looper,message,把message发送到新线程的looper,用新线程的handler来处理,然后在handleMessage(Message msg)处理函数里,转而再将msg发送到Ui线程的消息队列让ui的handler处理。会怎样呢?
 见代码:【部分关键代码截图】

会出现哪些问题:
1.提示message is already in use。 看到这个怎么办呢? 理解上讲,消息在当前的消息队列中,而我又想把它发送到主线程的消息队列,怎么可能呢?于是我通过removeMessage函数尝试了一下,错误依然。百度得知,removeMessage 删除的是消息队列中,还未被handler处理的消息,显然我的消息现在处在被处理状态,删不掉,待它出队,我还不知道怎么办,但我可以找个替代品,然后把该消息用obtain取出来,给替代品,再发送替代品,就ok了。
以后我还会尝试,怎么确定消息已经出队,这样就不用替代品,真正意义上达到,消息的嵌套处理了。【终极原则不要让message有同时出现在两个消息队列的趋势】。
待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值