定义一个线程有两种方法:
①新建一个继承于Thread的类,重写run方法(线程要执行的东西写里面),调用Thread实例的start方法即可启动,run执行完之后线程一般会自动结束,不可再次启动
1 2 3 4 5 6 7 |
class MyThread extends Thread{ @Override public void run(){ //线程里要执行的东西 } } new MyThread().start(); |
②新建一个继承于Thread的类,初始化时传入一个实现runnable接口的引用,在runnable接口中重写run方法,调用Thread实例的start方法即可启动
安卓的UI是线程不安全(多线程访问时没有保护,可能会出错)的,所以更新UI必须要在主线程进行,若在其他线程直接修改UI就会出错。
1 2 3 4 5 6 |
new Thread(new Runnable(){ @Override public void run(){ //线程里要执行的东西写这 } }).start(); |
异步消息处理机制
某一个线程创建handler对象,重写handleMessage用于处理其他线程发过来的消息,其他线程调用handler对象的sendMessage可以发送消息给创建handler的线程。
创建handler之前需要执行Looper.prepare()和Looper.loop(),在UI线程中已经在启动时调用过了 故不需要重新调用。
以下为创建handler的代码(一般在主线程中创建)
Handler handler = new MyHandler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
//这里写处理代码
}else if(msg.what==2){
}
else if(msg.what==3){
}
}
};
以下为发送消息到Handler的代码
Message msg=new Message();
msg.what=3;
msg.obj=str1;//可以附带obj传过去
handler.sendMessage(msg);//这里的handler必须为上面Handler创建的引用
再UI线程之外不能直接更新UI,但有个类可以比较方便的使用 实现更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
//这里的代码会在UI线程执行
}
});