当前位置 : 主页 > 编程语言 > python >

Android中Handler消息传递机制应用之子线程不允许操作主线程的组件

来源:互联网 收集:自由互联 发布时间:2023-03-22
场景 进程 一个Android应用就是一个一个进程,每个应用在各自的进程中运行。 线程 比进程更小的独立运行的基本单位,一个进程可以包含多个线程。 要求 一个TextView和一个Button,点击

场景

进程

一个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后,点击按钮会发现程序停止运行

Android中Handler消息传递机制应用之子线程不允许操作主线程的组件_ide

 

然后查看输出异常:Only the original thread that created a view hierarchy can touch its views.

Android中Handler消息传递机制应用之子线程不允许操作主线程的组件_ide_02

 

这句话的意思就是不能在子线程中更新主线程。

文本框就是主线程的,而按钮就是子线程的,子线程不能更新主线程的组件。

为此,安卓提供了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中提供的一个消息处理的机制。

能在任意线程中发送消息,能在主线程中获取并处理消息。

上一篇:Java中使用Jedis连接Redis数据库流程
下一篇:没有了
网友评论