Android---Handler消息机制
Handler消息机制
优点:
写法:
1.主线程中创建一个Handler对象
Handler handler = new handler(){};
2.复写Handler对象的handlerMessage方法
public void handleMessage(android.os.Message
msg) { }
3.在子线程中创建一个Message对象
Message msg = Message.obtain();
4.将结果绑定给Message
msg.obj = bitmap;
5.使用主线程中的handler对象将message发送给主线程处理
handler.sendMessage(msg);
6.主线程中的handlerMessage方法接受子线程发来的Message对象;获取结果,处理Ui.
Bitmap bitmap = (Bitmap) msg.obj;
iv_pic.setImageBitmap(bitmap);
例子:
主线程:
//☆☆1.在主线程创建一个Handler对象
//☆☆2.复写Handler对象的handlerMessage方法
private
Handler handler = new Handler(){
//☆☆☆6.主线程中的handlerMessage方法接受子线程中发来的Message对象,做处理;
public
void handleMessage(android.os.Message msg) {
//该方法处于主线程,主线程可以更新UI。
String
result = (String) msg.obj;
//5.将字符串显示到TextView上。 ok
tv_source.setText(result);
};
};
子线程:
//☆☆3.在子线程中创建一个Message对象
Message
msg = new Message();
//☆☆4.将网络访问获取的结果绑定到Message对象上
msg.obj
= result;
//☆☆5.使用主线程中创建的handler对象,发送一个Message对象到主线程
handler.sendMessage(msg);
原理:
涉及对象:
Handler: 主要在子线程中将Message发送给主线程,在主线程中接受Message并处理。
每一个Handler实例,都有一个单独的线程与之配合。
Message:一个消息对象,主要在子线程中绑定结果,携带到主线程。
MessageQueue:位于主线程,是一个消息队列,接受子线程中发来的一个Message对象。
Looper: 消息循环器,不断的从MessageQueue中取出一个个Message对象。
常见消息处理api
1. 面试题:子线程不能够更新UI吗?
1.审计机制:activity完全展示之后,审计机制才会工作去检测子线程是否更新UI,如果更新就报错;
Activity没有完全显示之前(onCreate方法没执行完毕),审计机制不会工作,就不会检测子线程中做的事情,
所以即使更新UI也不会报错。
2.android中,与进度条相关的控件
也可以在子线程中更新UI.
3.SurfaceView
也可在子线程中更新UI.
2. Activity的方法, 不管当前所在线程是否是主线程,方法中的runnable都会被发送到主线程中执行。
runOnUiThread(new
Runnable() {
@Override
public void run()
{
tv.setText("我被更改了");
}
});
3. handler.post方法,将执行的动作发送到主线程中执行
handler.post(new
Runnable() {
@Override
public void run()
{
tv.setText("我再次被更改了");
}
});
ps:主线程中需要创建handler对象 Handler handler = new Handler( );
4.handler.postDelayed方法,将执行的动作延时多长时间后发送到主线程中执行; delayMillis:延时时间
handler.postDelayed(new
Runnable() {
@Override
public void run() {
tv.setText("我再再再次被更改了");
}
},
5000);
子线程相关
第四种方式有一个应用场景:展示广告多少秒后,跳转主界面。