Thread thread = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});
public class MainActivity extends Activity implements Runnable{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
@Override
public void run() {
// TODO Auto-generated method stub
}
}
thread.start();
Thread.sleep(1000);//休眠1秒
public class MainActivity extends Activity implements Runnable{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LooperThread thread = new LooperThread();
thread.start();
thread.interrupt();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(!Thread.currentThread().isInterrupted()){
// do something
}
}
}
前面介绍了现成的用法,不过不能在新建的子线程中对UI进行修改。如果要操作,会报错Only the original thread that created a view hierarchy can touch its views。为此,Android引入Handler消息传递机制,来实现在线程中操作UI界面。
在Android中,一个线程对应一个Looper对象,一个Looper对象对应一个MessageQueue(消息队列)。MessageQueue用于存放message。在MessageQueue中,存放的消息按照FIFO原则执行。
Looper对象用来为线程开启一个消息循环,从而操作MessageQueue。默认情况下,系统自动为主线程创建Looper对象,开启消息循环。所以,在主线程中用下面的代码创建Handler对象不会出错,而在非主线程中则会报错。
Handler handler = new Handler();
如果想在非主线程中创建Handler对象,必须用到Looper:
public class LooperThread extends Thread {
public Handler h;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare(); //
h = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i("Looper", String.valueOf(msg.what));
}
};
Message m = h.obtainMessage();
m.what = 0x11;
h.sendMessage(m);
Looper.loop();
}
}
Handler主要有以下两个作用:
(1)将Message或Runnable应用post()或sendMessage()方法发送到MessageQueue中,发送时可以指定延迟时间或者绑定的Bundle数据。当MessageQueue循环到该Message时,调用handlerMessage()方法对其处理。
(2)在子线程与主线程进行通信,也就是在工作线程中与UI进行通信
Message具有如下5个属性
在使用时,需要注意以下3点: