android 按钮控制线程,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 classMainActivity extends AppCompatActivity {

@Overrideprotected voidonCreate(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(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {//创建新线程

Thread thread = new Thread(newRunnable() {

@Overridepublic voidrun() {

textView.setText("霸道的程序猿");

}

});

thread.start();//开启线程

}

});

}

}

注:

实现

运行APP后,点击按钮会发现程序停止运行

a5da09b35ed6cbbfac1d0cc03b7e7734.png

3202731

然后查看输出异常: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 classMainActivity extends AppCompatActivity {

@Overrideprotected voidonCreate(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= newHandler(){

@Overridepublic voidhandleMessage(@NonNull Message msg) {

super.handleMessage(msg);if(msg.what ==0x123){

textView.setText("公众号:霸道的程序猿");

}

}

};

button.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {//创建新线程

Thread thread = new Thread(newRunnable() {

@Overridepublic voidrun() {//发送空消息

handler.sendEmptyMessage(0x123);//textView.setText("霸道的程序猿");

}

});

thread.start();//开启线程

}

});

}

}

总结:

Handler是android中提供的一个消息处理的机制。

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值