Hanlder作用

以前经常用,用的时候不理解,并没有系统总结,很惭愧。


Hanlder作用有三点:

1)执行计划任务,可以再预定某些任务,可以模拟定时器等;

2)线程间通讯。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,可以在子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父对象的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其他线程中更新界面。

3)确保操作始终在某个特定的线程中运行。例如,当我们从数据库加载数据时,除了程序启动时需要加载外,每当我们收到数据改变的通知时也需要重新加载。为了确保数据的有效性(始终使用最后一次查询时得到的数据),并减少不必要的查询操作,我们应当确保他们在同一个线程中运行。


关键字理解:

1)Looper(相当于隧道)一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue。

2)Handler,你可以构建Handler对象来与Looper沟通,以便push新消息到Message Queue里。或者,接受Looper(从Message Queue中取出)所送来的消息。

3)Message Queue,用来存放线程消息。

4)线程,UI 线程通常指的是主线程,


问题点:

1)多个Handler使用同一个HandlerThread:

>同一个HandlerThread中可以有多个Handler吗?可以有。

>同一个HandlerThread中使用多个Handler的Message会混淆吗?不会的,WHY?

2)Handler可以创建到任意线程中吗?

>在普通的Thread中调用new Handler()创建并发送消息?can't!

>在HandlerThread.onLooperPrepared()中调用new Handler创建并发送消息。可以。

3)如何制定Handler运行的线程

  调用Handler(Looper)以确定其使用的Looper

  创建Handler时调用HandlerThread.getLooper()获取指定线程的Looper

  调用Looper.getMainLooper()获取UI线程的Looper

4)同一个Handler中不同的消息会同时执行吗?

>定义两条有耗时操作的Message,并同时发送这两条消息。不可能同时,处理完一条message才会处理另外一条。

常识定义一个Runnable,尝试同时执行Message和Runnable。

5)对于正在执行的Message,调用removeMessage会有什么后果?

  removeMessage可以移除一个还没开始执行的Message;

  一个正在运行的Message,不能被remove掉。


通过分析得出Handler其实很简单:

1)Handler实例与消息处理是关联的,发送和接收要匹配;

2)只能依附在HandlerThread中,普通的Thread是不能有Handler的;

3)可以通过设置Looper来选择其依附的线程;

4)所有操作都是用一个线程,不需要做线程同步;

5)removeMessage只能移除队列中得Message。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值