一起Talk Android吧(第一百八十回:Android中的Handler机制九)

2024-03-12 04:08

本文主要是介绍一起Talk Android吧(第一百八十回:Android中的Handler机制九),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

各位看官们大家好,上一回中咱们说的是Android中Handler机制的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,由于时间的原因我们在上一回中只演示了布局文件,这一回将演示Activity的代码,下面是具体的代码,请大家参考:

package com.example.talk8.blogapp05_handler;import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private TextView mNameMainThread;private TextView mIDMainThread;private Button mBTStartMsg;private Button mBTEndMsg;private TextView mNameSubThread;private TextView mIDSubThread;private Button mBTShowName;private Button mBTdShowId;//消息类型private final int MSG_START = 0;private final int MSG_END = 1;private final int MSG_SHOW_NAME = 2;private final int MSG_SHOW_ID = 3;private Thread mSubThread;public SubHandler mSubHandler;public  Handler  mSubThreadHandler;public Looper mSubThreadLooper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过TextView控件显示主线程的名字和线程IDmNameMainThread = (TextView)findViewById(R.id.id_tv_name_main_thread);mIDMainThread = (TextView)findViewById(R.id.id_tv_id_main_thread);//通过Button控件向消息队列中来发送消息,这里有两个Button用来发送不同的消息mBTStartMsg = (Button) findViewById(R.id.id_bt_start_message);mBTEndMsg = (Button) findViewById(R.id.id_bt_end_message);//通过TextView控件显示子线程的名字和线程IDmNameSubThread = (TextView)findViewById(R.id.id_tv_name_sub_thread);mIDSubThread = (TextView)findViewById(R.id.id_tv_id_sub_thread);//通过Button控件来修改主线程中的控件内容,使其显示子线程的名字和IDmBTShowName = (Button) findViewById(R.id.id_bt_show_name);mBTdShowId = (Button) findViewById(R.id.id_bt_show_id);//创建自定义的Handler对象mSubHandler = new SubHandler();//创建子线程,并且在子线程中实现属于子线程自己的Handler机制mSubThread = new Thread( () ->{//1.初始化消息队列Looper.prepare();//2.创建子线程自己的LoopermSubThreadLooper = Looper.myLooper();if(mSubThreadLooper != null) {//3.创建子线程自己的Handler类对象,这里是匿名对象mSubThreadHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {//重写Handler方法用来处理消息队列中的消息super.handleMessage(msg);switch (msg.what){case MSG_SHOW_NAME:Toast.makeText(getApplicationContext(),""+msg.obj,Toast.LENGTH_LONG).show();sendMsg(msg.what,""+msg.obj); //send msg to Main threadbreak;case MSG_SHOW_ID:Toast.makeText(getApplicationContext(),""+msg.obj,Toast.LENGTH_LONG).show();sendMsg(msg.what,""+msg.obj);break;default:break;}}};//4.启动消息队列Looper.loop();}else {sendMsg(0,"sub looper is null");}//5.销毁子线程的Looper以及消息队列mSubThreadLooper.quit();});mSubThread.start();mNameMainThread.setText("Nmae: "+Looper.myLooper().toString());mIDMainThread.setText("ID: "+Thread.currentThread().getId());//给主线程中的消息队列中发送消息mBTStartMsg.setOnClickListener(v ->sendMsg(MSG_START,"Start"));mBTEndMsg.setOnClickListener(v -> sendMsg(MSG_END,"End"));mNameSubThread.setText("Name: "+ mSubThread.getName());mIDSubThread.setText("ID: "+mSubThread.getId());//显示子线程的名字和IDmBTShowName.setOnClickListener(v -> showName() );mBTdShowId.setOnClickListener(v -> showId());}//public class SubHandler extends Handler {//主线程中的消息处理,前两条消息,只是弹出Toast,并且显示消息内容//后两条消息是从子线程中发出的,用来显示子线程的名字和ID@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case MSG_START:showMessage(msg.obj.toString());break;case MSG_END:showMessage(msg.obj.toString());break;case MSG_SHOW_NAME:mNameSubThread.setText((String)msg.obj);break;case MSG_SHOW_ID:mIDSubThread.setText((String)msg.obj);break;default:showMessage(msg.obj.toString());break;}}}//向主线程的消息队列中发送消息public void sendMsg(int type,String content) {Message msg = new Message();msg.what = type;msg.obj =content;mSubHandler.sendMessage(msg);}public void showMessage(String s) {String text ="Recived Message,It is: ";if(s != null) {Toast.makeText(getApplicationContext(), text+s, Toast.LENGTH_LONG).show();}else {Toast.makeText(getApplicationContext(), text+"empty." , Toast.LENGTH_LONG).show();}}public void showName() {Message m = new Message();m.what = MSG_SHOW_NAME;m.obj= "Name: "+mSubThreadLooper.toString();mSubThreadHandler.sendMessage(m);}public  void showId() {Message m = new Message();m.what = MSG_SHOW_ID;m.obj= "Id: "+mSubThread.getId();mSubThreadHandler.sendMessage(m);}
}

看官们,我们在代码中主要的地方都添加了注释,并且在部分涉及到流程的地方还添加了数字符号,请大家结合我们在前面章回中介绍的Handler使用步骤来查看代码,相信大家都可以看明白。下面是程序的运行结果,请大家参考。
在这里插入图片描述
结合代码和程序运行结果,我们对此程序做一些说明:
在主线程中我们通过点击按钮来向消息队列中发送消息,主线程的Handler收到消息后弹出Toast并且显示消息内容;大家注意,主线程中的Looper是Activity创建的,我们在前面章回中分析过,为了更好的演示Handler机制,我们使用Thread创建了子线程,并且在子线程创建了Looper以及Handler,子线程中也是通过点击按钮发送消息的,子线程的Handler收到消息后又把消息发送了主线程的消息队列中,主线程的Handler收到消息后在屏幕上显示子线程的名称的ID。这个感觉有点绕呀,为什么不直接在子线程中显示子线程的名称的ID?

各位看官,关于Android中Handler机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

这篇关于一起Talk Android吧(第一百八十回:Android中的Handler机制九)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800094

相关文章

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析