在Android中,当应用启动,系统会创建一个主线程(main thread)。
主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。
即 main thread 也叫UI线程。
系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都从UI线程分发出去。
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。且 UI 主线程不允许其他线程来操作UI组件(主要包含:android.widget and android.view)
为此,Android提供了两种解决办法:
Handler 和 AsynTask
单线程模式 : Handler
在单线程模型下,为了解决类似的问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。(在Android系统中提供了一系列方便的类来管理线程——Looper用来在一个线程中执行消息循环,Handler用来处理消息)下面将对它们进行分别介绍:
Message:是指子线程将需要更新UI的信息发送到Message Queue当中。
Handler : 是指主要对Message进行处理。负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的Handler对象引用来sendMessage(Message)。而使用Handler,需要实现该类的 handleMessage(Message) 方法,它是处理这些Message的操作内容,例如Update UI
Message Queue:用来存放通过Handler发布的消息,按照先进先出执行。 每个message queue都会有一个对应的Handler。Handler会向Message Queue通过sendMessage()方法发送消息
需要注意的地方:在Android当中,系统会自动给UI主线程建立Message Queue,而子线程系统不会为其创建。所以子线程发给主线程的消息时,looper不会为null,而反过来有可能为null。所以在子线程当中必须声明:Looper.prepare和Looper.loop , 在这两者之间就相当于一个Message Queue
private Handler mHandler;
class MyThread extends Thread{
@Override
public void run() {
Looper.prepare();
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
//处理接收到的消息
Log.d("Handler","接收到主线程发来的消息");
}
};
Looper.loop();
}
}