android中handler,Android中Handler详解及使用示例

Android中Handler详解及使用示例

Android中Handler详解及使用示例

Handler是Android提供用于更新UI的一套消息处理机制。

主要作用有两个:

在新启动的线程中发送消息

在主线程中获取并处理消息

//1.实例化 Handler

//2.在子线程中发送空消息

//3.Handler对象接受消息,并处理

private Handler handler = new Handler() {

//只要Handler发了消息,必然会触发该方法,并且传入一个Message对象

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

if (msg.what == 1) {

textView.setText("received msg succeed !");

}

}

};

//子线程发送空消息给主线程的Handler处理

private void sendEmptyMessage() {

//模拟在线程

new Thread() {

@Override

public void run() {

//发送空消息给HandlerMessage

//这里相当于Message对象中的.what == 1;

handler.sendEmptyMessage(1);

}

}.start();

}

运行结果:

a9ff2bf7a595fcf2b789bd19de3c6e6e.png

Message是在线程之间传递的消息,它可以在内部携带少量的

信息,用于在不同线程之间交换数据。

常用属性:

what属性

arg1属性

obj属性

private Handler handler = new Handler() {

//只要Handler发了消息,必然会触发该方法,并且传入一个Message对象

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

if (msg.what == 1) {

textView.setText("received msg succeed !");

} else if (msg.what == 2) {

int i = ((Random)msg.obj).nextInt();

Toast.makeText(MainActivity.this, "Random.nextInt() = " + i,

Toast.LENGTH_SHORT).show();

}

}

};

//子线程发送空消息给主线程的Handler处理

private void sendMessage() {

new Thread() {

@Override

public void run() {

//what:用于区分handler发送消息的不同线程来源

//arg1,arg2:如果子线程需要想主线程传递整型数据,则可用这些参数

//obj:Object

Message msg = new Message();

msg.what = 2;

msg.arg1 = 1234;

msg.arg2 = 2333;

msg.obj = new Random();

handler.sendMessage(msg);

}

}.start();

}

Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中 ,然后每当MesssageQueue中存在一条消息,Looper就会将这条消息取出,并将它传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。主线程默认有一个Looper。

MessageQueue就是消息队列的意思,它只要用于存放所有通过Handler发送过来的消息。这部分消息会一直存放于消息队列当中,等待被处理。

Handler handler2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

testLooperThread();

handler2.sendEmptyMessage(2);

}

private void testLooperThread() {

new Thread() {

@Override

public void run() {

//开启Looper

Looper.prepare();

handler2 = new Handler() {

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

Toast.makeText(MainActivity.this,

"主线程传来的message.what:" + msg.what,

Toast.LENGTH_SHORT).show();

}

};

//Looper循环,相当于产生了一个while(true){...}

Looper.loop();

}

}.start();

}

一个线程只有一个Message Queue,Message通过MessageQueue.IdleHandler关联到该线程的Looper上,通过Looper.looper()来处理消息分发到该handler回调。

Looper、Message Queue、Handler的关系:

d73d8b62f9d2b7827a7f4d78df3b1000.png

Android中Handler详解及使用示例相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值