进程(一) 1.3 Android中异步处理大杀器——Handler(2)

这里介绍下handler中除了sendMessage外还有post的方法发送和处理消息;

介绍几个方法:

final boolean	 post(Runnable r)
final boolean	 postAtFrontOfQueue(Runnable r)
final boolean	 postAtTime(Runnable r, Object token, long uptimeMillis)
final boolean	 postAtTime(Runnable r, long uptimeMillis)
final boolean	 postDelayed(Runnable r, long delayMillis)
通过读源码(会在后面的章节中分析下源码),我们会发现这些方法都是一个个嵌套实现的,而且最终都会调用到SendMessageAtTime()这个方法,这也说明post和sendMessage使用的是同一消息队列,不过这些都是后话,会在源码分析的时候和大家在分享下。


先给使用runable更新ui的例子

public class HandlerTest extends Activity {
    private Handler handler = new Handler();
    private String TAG = "System.out";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler.post(r);
        setContentView(R.layout.main);
        
        Log.d(TAG,"Activity id:"+Thread.currentThread().getId());
        Log.d(TAG,"Activity name:"+Thread.currentThread().getName());
        
    }
    Runnable r = new Runnable()
    {
    	public void run()
    	{
    	    Log.d(TAG,"Handler id:"+Thread.currentThread().getId());
            Log.d(TAG,"Handler name:"+Thread.currentThread().getName());
            try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    };
}


结果显而易见的我们可以知道:

他们调用的其实就是同一线程,主线程,为什么呢?因为当一个handler生成一个对象的时候,他就自动与他所在的线程进行了绑定,使用的是同一个消息循环和消息队列;

很多人是不是会这样认为呢,在同一线程,这不是会堵塞主线程,但是handler又是异步的这岂不是自相矛盾了???其实不然,其实handler在生成消息循环的时候,系统会自动生成以个线程,而不是我们主动去产生的,所以其实他不存在阻塞的问题。

这时android的源码:

public static Looper myLooper() {
        return sThreadLocal.get();
    }

这个函数就是获取消息循环的,而Looper就是从sThreadlocal中获取的,而这个sThreadlocal底层是实现的,是由系统产生的。

所以我觉得,网上很多解释,感觉是有问题,个人理解,愿大家给出你们的想法,相互讨论下。。。。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值