织梦CMS - 轻松建站从此开始!

欧博ABG官网-欧博官方网址-会员登入

Android异步通信:手把手教你使用Handler消息传递机欧博注册制(含实例讲解)

时间:2024-05-31 12:37来源: 作者:admin 点击: 14 次
在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理

前言

在Android开发的多线程应用场景中,欧博注册Handler机制十分常用

今天,我将献上一份 Handler机制的使用教程 ,希望你们会喜欢

Anroid Handler系列文章教程

目录

1. Handler 机制简介

定义 一套 Android 消息传递机制 / 异步通信机制

作用

在多线程的应用场景中,欧博代理将工作线程中需更新**UI**的操作信息 传递到 UI**主线程**,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理

为什么要用 Handler消息传递机制 答:多个线程并发更新UI的同时 保证线程安全。具体描述如下

总结 使用Handler的原因:将工作线程需操作UI的消息 传递 到主线程,欧博官网使得主线程可根据工作线程的需求 更新UI,从而避免线程操作不安全的问题

2. 相关概念

关于 Handler 机制中的相关概念如下:

在下面的讲解中,我将直接使用英文名讲解,欧博娱乐即 Handler、Message、Message Queue、Looper,希望大家先熟悉相关概念

3. 使用方式

Handler使用方式 因发送消息到消息队列的方式不同而不同

共分为2种:使用Handler.sendMessage()、使用Handler.post()

4. 使用步骤方式1:使用 Handler.sendMessage()

在该使用方式中,又分为2种:新建Handler子类(内部类)、匿名 Handler子类

但本质相同,欧博allbet即 继承了Handler类 & 创建了子类

代码语言:javascript

复制

/** * 方式1:新建Handler子类(内部类) */ // 步骤1:自定义Handler子类(继承Handler类) & 复写handleMessage()方法 class mHandler extends Handler { // 通过复写handlerMessage() 从而确定更新UI的操作 @Override public void handleMessage(Message msg) { ...// 需执行的UI操作 } } // 步骤2:在主线程中创建Handler实例 private Handler mhandler = new mHandler(); // 步骤3:创建所需的消息对象 Message msg = Message.obtain(); // 实例化消息对象 msg.what = 1; // 消息标识 msg.obj = "AA"; // 消息内容存放 // 步骤4:在工作线程中 通过Handler发送消息到消息队列中 // 可通过sendMessage() / post() // 多线程可采用AsyncTask、继承Thread类、实现Runnable mHandler.sendMessage(msg); // 步骤5:开启工作线程(同时启动了Handler) // 多线程可采用AsyncTask、继承Thread类、实现Runnable /** * 方式2:匿名内部类 */ // 步骤1:在主线程中 通过匿名内部类 创建Handler类对象 private Handler mhandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作 @Override public void handleMessage(Message msg) { ...// 需执行的UI操作 } }; // 步骤2:创建消息对象 Message msg = Message.obtain(); // 实例化消息对象 msg.what = 1; // 消息标识 msg.obj = "AA"; // 消息内容存放 // 步骤3:在工作线程中 通过Handler发送消息到消息队列中 // 多线程可采用AsyncTask、继承Thread类、实现Runnable mHandler.sendMessage(msg); // 步骤4:开启工作线程(同时启动了Handler) // 多线程可采用AsyncTask、继承Thread类、实现Runnable

方式2:使用Handler.post()

代码语言:javascript

复制

// 步骤1:在主线程中创建Handler实例 private Handler mhandler = new mHandler(); // 步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容 // 需传入1个Runnable对象 mHandler.post(new Runnable() { @Override public void run() { ... // 需执行的UI操作 } }); // 步骤3:开启工作线程(同时启动了Handler) // 多线程可采用AsyncTask、继承Thread类、实现Runnable

5. 实例讲解

本文将用实例逐个讲解 Handler的用法

注:

由于Handler的作用 = 将工作线程需操作UI的消息 传递 到主线程,使得主线程可根据工作线程的需求 更新UI,从而避免线程操作不安全的问题

故下文的实例 = 1个简单 “更新UI操作” 的案例

主布局文件相同 = 1个用于展示的TextView,具体如下:

布局代码:activity_main.xml

代码语言:javascript

复制

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="com.example.carson_ho.handler_learning.MainActivity"> <TextView android:id="@+id/show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </RelativeLayout>

实例的源码地址:Carson_Ho的Github:Handler (建议:先fork下来再看,效果会更好哦!)

5.1 使用 Handler.sendMessage()方式1:新建Handler子类(内部类)

具体使用

代码语言:javascript

复制

public class MainActivity extends AppCompatActivity { public TextView mTextView; public Handler mHandler; // 步骤1:(自定义)新创建Handler子类(继承Handler类) & 复写handleMessage()方法 class Mhandler extends Handler { // 通过复写handlerMessage() 从而确定更新UI的操作 @Override public void handleMessage(Message msg) { // 根据不同线程发送过来的消息,执行不同的UI操作 // 根据 Message对象的what属性 标识不同的消息 switch (msg.what) { case 1: mTextView.setText("执行了线程1的UI操作"); break; case 2: mTextView.setText("执行了线程2的UI操作"); break; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.show); // 步骤2:在主线程中创建Handler实例 mHandler = new Mhandler(); // 采用继承Thread类实现多线程演示 new Thread() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 步骤3:创建所需的消息对象 Message msg = Message.obtain(); msg.what = 1; // 消息标识 msg.obj = "A"; // 消息内存存放 // 步骤4:在工作线程中 通过Handler发送消息到消息队列中 mHandler.sendMessage(msg); } }.start(); // 步骤5:开启工作线程(同时启动了Handler) // 此处用2个工作线程展示 new Thread() { @Override public void run() { try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } // 通过sendMessage()发送 // a. 定义要发送的消息 Message msg = Message.obtain(); msg.what = 2; //消息的标识 msg.obj = "B"; // 消息的存放 // b. 通过Handler发送消息到其绑定的消息队列 mHandler.sendMessage(msg); } }.start(); } }

运行结果

方式2:匿名内部类

具体使用

代码语言:javascript

复制

public class MainActivity extends AppCompatActivity { public TextView mTextView; public Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.show); // 步骤1:在主线程中 通过匿名内部类 创建Handler类对象 mHandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作 @Override public void handleMessage(Message msg) { // 根据不同线程发送过来的消息,执行不同的UI操作 switch (msg.what) { case 1: mTextView.setText("执行了线程1的UI操作"); break; case 2: mTextView.setText("执行了线程2的UI操作"); break; } } }; // 采用继承Thread类实现多线程演示 new Thread() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 步骤3:创建所需的消息对象 Message msg = Message.obtain(); msg.what = 1; // 消息标识 msg.obj = "A"; // 消息内存存放 // 步骤4:在工作线程中 通过Handler发送消息到消息队列中 mHandler.sendMessage(msg); } }.start(); // 步骤5:开启工作线程(同时启动了Handler) // 此处用2个工作线程展示 new Thread() { @Override public void run() { try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } // 通过sendMessage()发送 // a. 定义要发送的消息 Message msg = Message.obtain(); msg.what = 2; //消息的标识 msg.obj = "B"; // 消息的存放 // b. 通过Handler发送消息到其绑定的消息队列 mHandler.sendMessage(msg); } }.start(); } }

运行结果

5.2 使用 Handler.post()

具体使用

代码语言:javascript

复制

public class MainActivity extends AppCompatActivity { public TextView mTextView; public Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.show); // 步骤1:在主线程中创建Handler实例 mHandler = new Handler(); // 步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容 new Thread() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 通过psot()发送,需传入1个Runnable对象 mHandler.post(new Runnable() { @Override public void run() { // 指定操作UI内容 mTextView.setText("执行了线程1的UI操作"); } }); } }.start(); // 步骤3:开启工作线程(同时启动了Handler) // 此处用2个工作线程展示 new Thread() { @Override public void run() { try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.post(new Runnable() { @Override public void run() { mTextView.setText("执行了线程2的UI操作"); } }); } }.start(); } }

运行结果

至此,关于Handler的异步消息传递机制的使用讲解完毕。

6. 总结

本文对Handler异步通信传递机制的使用进行了全面讲解

Anroid Handler系列文章教程

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。

如有侵权请联系 cloudcommunity@tencent.com 删除

前往查看

android

编程算法

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

(责任编辑:)
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2024-09-20 00:09 最后登录:2024-09-20 00:09
栏目列表
推荐内容