多线程:包括进程、线程。
进程:一个Android应用就就是一个进程,每个应用在各自的进程中进行。(通常说的关闭手机某个应用进程)
线程:比进程更小的独立运行的基本单位,一个进程可以包含多个线程。如:微信进程app,消息聊天界面包括:对话界面(UI线程)、播放语音(子线程)、下载视频(子线程)、接收消息(子线程)。
注:子线程也称Worker线程。
一、Handler
1.初识Handler
例子:点击按钮使文本框内容发生改变
//报错:Only the original thread that created a view hierarchy can touch its views.
void onClick(View v){
//创建的一个新线程
Thread thread=new Thread(new Runnable(){
public void run(){
textview.setText("文本内容改变");
}
});
thread.start();//开启线程
}
分析原因:
子线程不允许操作主线程中的组件,应该由按钮通知handler,再由handler更新UI组件。
修改后:
//主线程中定义handler(android.os包中)
Handler handler =new Handler(){
public void handleMessage(Message msg){//重写匿名内部类
super.handleMessage(msg);
if(msg.what==0x123){//获取消息代码,判断
textview.setText("文本内容改变");
}
}
};
//在点击事件里
public void run(){
handler.sendEmptyMessage(0x123);//发送空消息
}
总结:Handler是android中提供的一个消息处理机制。
作用:1.在任意线程中发送消息。2.在主线程中获取并处理消息。
使用Handler执行周期性指定任务:
final int TIME=60;//定义时间长度60s
final int TIMER_MSG=0x001;//消息代码
private int mProgressStatus=0;//定义任务条完成进度
handler.sendEmptyMessage(TIMER_MSG);//在onCreate()方法中,启动进度条
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(TIME-mProgressStatus>0){//当前进度大于0
mProgressStatus++;//进度加1
timer.setProgress(TIME-mProgressStatus);//timer为Progress实例化对象,更新进度
handler.sendEmptyMessageDelayed(TIMER_MSG,1000);//1000毫秒后发送消息
}else{
Toast.makeText(MainActivity.this,"时间到",Toast.LENGTH_SHORT).show();
}
}
};
使用Handler和Message实现轮播广告:
步骤:布局管理、通过ViewFlipper组件播放广告图片、创建Handler对象,实现3秒更新一次图片、开启广告轮播。
final int FLAG_MSG=0x001;//消息代码
private Message message;//声明消息对象
/*************在onCreate()中**************/
message.=Message.obtain();//获取Message对象
message.what=FLAG_MSG;//设置消息代码
handler.sentMessage(message);//发送消息
/*******在主线程中创建Handler对象,实现3秒更新一次图片****************/
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what==FLAG_MSG){
flipper.showPrevious();//切换到下一张图片
message=handler.obtainMessage(FLAG_MSG);//获取Message
handler.sendMessageDelayed(message.3000);//延迟3秒发送消息
}
}
}
二、Looper
不断从消息队列MessageQueue中获取Message,返回给Handler
handler:主线程:系统自动创建Looper对象 子线程:手动创建Looper对象
子线程中创建Looper对象的步骤:初始化Looper对象:prepare()方法->创建handler对象:new Handler()->启动Looper(从消息队列中获取、处理消息)->loop()
LooperThread.java(创建一个子线程)
public class LooperThread extends Thread{
public Handler handler;//声明一个Handler对象
@Override
public void run(){
super.run();
Looper.prepare();//初始化Looper对象!!!!!!!!!!!
handler=new Handler(){
@Override
public void handlerMessage(Message msg){
super.handleMessage(msg);
Log.i("Looper",String.valueOf(msg.what));//输出一条日志,标记为Looper
}
};
Message message=handler.obtainMessage();//获取Message
message.what=0x7;//设置消息代码
handler.sendMessage(message);//发送消息
Looper.loop();//启动Looper
}
}
MainActivity.java中
/************在onCreate()中*****************/
LooperThread thread=new LooperThread();//创建一个线程
thread.start();//开启线程
结果:locat中显示: Looper:7