以前经常用,用的时候不理解,并没有系统总结,很惭愧。
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。