说到多线程,这里先谈谈Android系统为何需要多线程。我们都知道,Android线程通常分两种,UI线程(Main Thread)和工作线程(Worker Thread)。Android规定,UI线程是不能做耗时操作的,否则会出现ANR错误,所以耗时操作都要放在work THread中进行。Android还有一个重要原则,不能在UI Thread之外的线程当中操纵我们的UI,所以一般更新UI操作都是用Main Thread和Worker Thread的交互来完成。
多线程机制的核心为Handler,这里先解释下Andrid的Handler原理。(这也是面试最常见的问题)
根据Android SDK,线程间通讯涉及到这几个类:Handler,Loop,Message,MessageQueue 。
Handler在android里负责发送和处理消息,通过它可以实现其他线程与Main线程之间的消息通讯。
Looper负责管理线程的消息队列和消息循环。
Message是线程间通讯的消息载体。两个码头之间运输货物,Message充当集装箱的功能,里面可以存放任何你想要传递的消息。
MessageQueue是消息队列,先进先出,它的作用是保存有待线程处理的消息
简单点说,它们四者之间的关系是,在其他线程中调用Handler.sendMessage()方法(参数是Message对象),将需要UI线程处理的事件添加到UI线程的MessageQueue中,UI线程通过MainLooper从消息队列中取出Handler发过来的这个消息时,会回调Handler的handlerMessage()方法。
下面说说一个线程更新UI的简单例子,说明UI线程和工作线程是如何通讯的。
1 先写一个类继承Thread或者实现Runable接口 然后重写run方法
class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
if (isTrue) { //isTure只是一个标志位
Message message = new Message();
message.what = 0;
mHandler.sendMessage(message);
}
}
}
2 new一个Handler对象 并重写HandlerMessage方法,接收子线程发送的message,并更新UI。
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.what == 0) {
tv1.setText("更新后tv1");
tv2.setText("更新后tv2");
}
}
} ;
3 启动线程
在需要的地方调用start方法启动线程(一般都在点击事件中启动)
myThread = new MyThread();
myThread.start();
Handler这块还有很多问题 后续继续更新