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


    场景

    进程:

    一个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();//开启线程
                }
            });
        }
    }

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    运行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中提供的一个消息处理的机制。

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

  • 相关阅读:
    10.6比赛 T1
    10.5比赛 T3
    10.5比赛 T2
    10.5比赛 T1
    最大子序列问题
    Python编程快速上手_第 4 章 列表
    Python编程快速上手_第 3 章 函数
    Python编程快速上手_第 2 章 控制流
    Python编程快速上手_第 1 章 Python基础
    Python 编程快速上手 ——让繁琐工作自动化
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12489844.html
Copyright © 2020-2023  润新知