当前位置: 移动技术网 > IT编程>移动开发>Android > Android中Handler消息传递机制应用之子线程不允许操作主线程的组件

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

2020年03月14日  | 移动技术网IT编程  | 我要评论

机场女性安检通道,人民币对韩元,搜秀影城

场景

进程:

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网