Android中Handler消息传递机制应用之子线程不允许操作主线程的组件
程序员文章站
2022-06-25 08:42:01
场景 进程: 一个Android应用就是一个一个进程,每个应用在各自的进程中运行。 线程: 比进程更小的独立运行的基本单位,一个进程可以包含多个线程。 要求: 一个TextView和一个Button,点击Button后新开一个线程更改TextView的内容。 修改activity_main.xml, ......
场景
进程:
一个android应用就是一个一个进程,每个应用在各自的进程中运行。
线程:
比进程更小的独立运行的基本单位,一个进程可以包含多个线程。
要求:
一个textview和一个button,点击button后新开一个线程更改textview的内容。
修改activity_main.xml,在页面添加一个textview和一个button,然后分别设置其id属性。
然后在mainactivity中获取button按钮,然后在button的点击事件中修改textview的内容。
如果只通过以下代码是否能实现
package com.badao.handlertest; import androidx.appcompat.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.textview; public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); final textview textview = findviewbyid(r.id.text1); button button = findviewbyid(r.id.button2); button.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //创建新线程 thread thread = new thread(new runnable() { @override public void run() { textview.settext("霸道的程序猿"); } }); thread.start();//开启线程 } }); } }
注:
博客:
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
运行app后,点击按钮会发现程序停止运行
然后查看输出异常:only the original thread that created a view hierarchy can touch its views.
这句话的意思就是不能在子线程中更新主线程。
文本框就是主线程的,而按钮就是子线程的,子线程不能更新主线程的组件。
为此,安卓提供了handler,我们可以在单击这个按钮的时候发送通知给handler,然后由handler更改这个文本框。
首先使用匿名内部类新建一个handler,然后重写其handlemessage方法。然后再按钮的点击事件中,调用handler对象的发送空消息的方法,发动一个int型变量,然后在上面的handlemessage方法中进行判断,如果与发送时设置的一样则重新改变textview的值。
代码修改为:
package com.badao.handlertest; import androidx.annotation.nonnull; import androidx.appcompat.app.appcompatactivity; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.view; import android.widget.button; import android.widget.textview; public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); final textview textview = findviewbyid(r.id.text1); button button = findviewbyid(r.id.button2); final handler handler = new handler(){ @override public void handlemessage(@nonnull message msg) { super.handlemessage(msg); if(msg.what ==0x123){ textview.settext("公众号:霸道的程序猿"); } } }; button.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //创建新线程 thread thread = new thread(new runnable() { @override public void run() { //发送空消息 handler.sendemptymessage(0x123); //textview.settext("霸道的程序猿"); } }); thread.start();//开启线程 } }); } }
总结:
handler是android中提供的一个消息处理的机制。
能在任意线程中发送消息,能在主线程中获取并处理消息。