android之Handler子线程的简单介绍(一)

1、Android线程
a)单线程模式
b)Android进程在启动时,
会创建一个主线程(UI线程)去处理UI相关操作,
为了效率考虑,主线程不是线程安全的.
c)子线程不能直接操作主线程内的控件
UI控件只能由UI线程去操作。
d)若要实现线程间通信,需要依赖于
Android消息机制等技术

2、消息机制:实现线程间通信
由于性能优化考虑,Android的UI操作并不是线程安全的,
这意味着如果有多个线程并发操作UI组件,可能导致线程
安全问题。为了解决这个问题,Android制定了一条简单的
规则:只允许UI线程修改Activity的UI组件。
如果子线程需要改变界面组件的属性值,需要借助于Handler
的消息机制来实现了。
消息机制一共工作的几个组件:Message Queue,Handler,Looper
(a)Message:Handler接收和处理的消息对象
(b)Message Queue:消息队列,
它采用先进先出的方式来管理Message。
MessageQueue一般用于管理消息。
(c)Handler
功能:
1)在新启动的线程中发送消息
(把消息发送给Looper管理的messageQueue)
2)在主线程中获取,处理消息
(负责处理Looper分给它的消息)
回调方法:但是新启动的线程何时发送消息?
何时获取和处理消息?
通过回调函数去处理
处理消息:handlerMessage(Message msg)处理消息的方法,
一般用于被重写
创建方式:1)Handler handler = new Handler();与当前线程的Looper关联
2)Handler handler = new Handler(Looper looper);
与指定Looper相关联

发送消息:1)sendEmptyMessage(int what);
        发送只包含what标记的空消息
        2)sendMessage(Message msg);
        发送一个标准的Message对象
        3)sendMessageDelayed(Message msg,long delayMillis)
               指定多少毫秒之后发送消息
        4)sendEmptyMessageDelayed(int what,long delayMillis)
               指定多少毫秒之后发送只有what标记的空消息

(d)Looper
每一个线程只能拥有一个Looper.
它的loop方法负责不断读取MessageQueue
中的消息,读到信息之后就把消息交个
发送该消息对应的Handler进行处理。

获取Looper的方式:
    1)Looper.getMainLooper  获取主线程Looper
    2)Looper.myLooper   获取当前线程Looper
程序创建Looper对象时会在它的构造器中创建MessageQueue对象。
    Looper提供的构造器源代码:
     private Looper(){
    mQueue=new MessageQueue();
    mRun = true;
    mThread=Thread.currentThread();
}
注:1)每条线程只能包含一个Looper与Message Queue
    2)主线程在创建过程中,系统会自动为其添加Looper与Message Queue
    子线程默认不会添加Looper与Message Queue
        需要调用Looper.prepare()来创建Looper对象
    与Looper.loop()方法来启动它。
    loop方法使用一个死循环不断取出
    MessageQueue中的消息,并将取出的
    消息分给该消息对应的handler进行处理。
    3)Looper与Message Queue之间是组合关系

3.使用Handler的步骤
都是在一个线程中完成的:
a)调用Looper的prepare()方法为当前线程创建Looper对象,
创建Looper对象时,能够在其会创建与之配套的MessageQueue,
主线程就不需要了.
b)有了Looper之后,创建Handler子类的实例,
重写handlerMessage()方法,
该方法负责处理来自于其他线程的消息。
c)调用Looper的loop()方法启动Looper,
主线程就不需要了。

要看实例的可以看这篇

你可能感兴趣的:(UI,android,通信,线程安全)