1. 创建线程
1.通过Thread类的构造方法创建线程
Thread thread = new Thread(new Runnable(){
publicvoid run(){
}
}).start();
2.通过实现Runnable接口创建线程
public class MainActivity extendsActivity implements Runnable{
publicvoid run(){
}
}
2.常见的线程操作
见线程操作
1.开启线程:
thread.start();
2.线程休眠
Thread.sleep(1000);
3.线程中断
thread.interrupt();
由于当线程执行wait(),join()或者sleep()方法的时候,线程的中断状态将被清除,所以如果在线程中执行了wait(),join()或者sleep()方法的时候。那么想要执行中断那么需要使用一个boolean变量来记录线程的中断状态,并通过该标记变量来控制循环的执行与停止。
在Android中一个线程对应一个Looper对象,而一个Looper对象又对应一个MessageQueue。MessageQueue用于存放Message的,在MessageQueue中存放的消息按照FIFO原则执行。
Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueue,在默认情况下,Android中新建的线程是没有开启消息循环的。但是主线程,系统会自动为它创建Looper对象,开启消息循环。所以,当在主线程中,应用下面代码创建Handler对象时,就不会出错;而如果在新创建的非线程中,应用下面的代码就会产生异常。
Handler handler2 = new Handler();
如果想要在非主线程中创建Handler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建一个Handler对象,再使用Looper类的looper()方法启动Looper,从消息队列里获取和处理消息。写在Looper.loop()之后的代码不会被执行,这个函数的内部是一个循环,当调用Handler.getLooper().quit()方法之后,loop()方法才会终止,后面的代码才能得以运行。
方法 | 描述 |
prepare() | 用于初始化Looper |
loop() | 调用Loop方法后,Loop线程就开始真正工作了,它会从消息队列中获取消息和处理消息 |
myLooper() | 用来获取当前线程的Looper对象 |
getThread() | 用于获取Looper对象所属的线程 |
quit() | 用于结束Looper循环 |
消息类被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象,每个Message对象可以通过Message.obtain()方法或者Handler.obtainMessage()方法中获得。
尽管Message方法有默认的构造方法,但是在通常情况下,需要使用Message.obtain()方法或者Handler.obtainMessage()方法来从消息池中获得空消息对象,以节省资源。
属性 | 类型 | 描述 |
arg1 | int | 用来存放整形数据 |
arg2 | int | 用来存放整形数据 |
obj | Object | 用来存放发送给接收器的Object类型的任意对象 |
replyTo | Messenger | 用来指定该Message发送到何处可选的Messager对象 |
what | int | 用于指定用户自定义的消息代码,这样接收者可以了解这个消息的信息 |
消息处理类允许发送和处理Message或者Runnable对象到其所在的线程的MessageQueue中。
Handler有以下两个主要作用:
(1)将Message或Runnable应用post()方法或者sendMessage()方法发送到MessageQueue中,在发送时可以指定延迟时间,发送时间或者要携带的Bundle数据。当MessageQueue循环到Message时,调用者可以调用相应的handlerMessage()方法对其进行处理.
(2)在子线程中与主线程进行通信也就是在工作线程中与UI线程进行通信。
在一个线程中只能有一个Looper或者MessageQueue,但是可以有多个Handler,而且这些Handler可以共享同一个Looper和MessageQueue
方法 | 描述 |
handleMessage(msg) | 处理消息的方法,通常重写该方法来处理消息,在发送消息时候该方法会自动回调 |
post(Runnable) | 立即发送Runnable对象,该Runnable对象会被封装成Message对象 |
postAtTime(Runnable,time) | 定时发送Runnable对象 |
postDelayed(Runnable,time) | 延迟发送Runnable对象 |
sendEmptyMessage(msg) | 发送空消息 |
sendMessage(msg) | 发送消息 |
sendMessageAtTime(msg,time) | 定时发送消息 |
sendMessageDelayed(msg,time) | 延迟发送消息 |
例子:
// 子线程
publicclass notMainThread extends Thread {
public Handler handler1 ;
@Override
public void run() {
super.run();
Looper.prepare();
handler1 = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 2:
Log.i("notMainThread","来自主线程的消息");
break;
default:
break;
}
super.handleMessage(msg);
}
};
Looper.loop();
}
}
// 主线程
publicclass MainActivity extends Activity {
Handler handler = null;
notMainThread notMain= null;
protected void onCreate(BundlesavedInstanceState) {
................................
handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Log.i("MainActivity","在主线程中获得消息消息代码");
break;
default:
break;
}
super.handleMessage(msg);
}
};
notMain = new notMainThread();
notMain.start();
.................................
//发送消息到非主线程
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Message m =notMain.handler1.obtainMessage();//获取非主线程的一个消息
m.what=2;
notMain.handler1.sendMessage(m);//发送消息
}
});
//发送消息到主线程
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Message m =MainActivity.this.handler.obtainMessage();//获取非主线程的一个消息
m.what=1;
MainActivity.this.handler.sendMessage(m);//发送消息
}
});
}
}
例子 (非主线程)