【技术博客】利用handler实现线程之间的消息传递

一、handler简介

在Android Studio的开发中,经常需要启动多个线程。比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃。这样一来发送请求后得到的远程服务器的返回信息,也仅反馈给了子线程,那么如果要将该消息传递到主线程,就需要使用handler来解决。

二、简单实例

在如下代码中,首先在主线程中new一个handler

@SuppressLint("HandlerLeak")final Handler handler=new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
String text = (String) msg.obj;
}
};

接着新建一个线程并让该线程开始,利用Message存储需要传递的信息,使用handler.sendMessage()方法,即可将消息返回给主线程。如上代码,调用msg.obj,即可在主线程中得到传递的消息。

 new Thread(){
@Override
public void run() {
super.run();
try {
Message message1 = Message.obtain();
message1.what= what;
message1.obj = result;//这是需要传递的信息
handler.sendMessage(message1);
} catch (IOException e) {
e.printStackTrace();
} }
}.start();

三、注意事项

由于handler是用于不同线程之间的,所以线程安全问题是非常重要的。

1、线程安全

message.what用来标识不同的消息,当需要返回多条消息时,该标识起很大作用。另外当多个handler同时发消息时,最好也加上.what标识加以区分返回的消息。

2、多个线程间的同步问题

首先注意,handler返回的消息在handleMessage方法内部,也就是说当你需要在主线程中获取消息时,必须在handleMessage方法内部,之后的所有逻辑代码也都在该方法内部进行。当出现多个handler同时发消息时,消息返回的顺序是不一定的。很可能会出现后开启的线程先发送了消息,与预期结果不符合得情况。所以要尽量避免多个handler进行调用,控制好多个线程间的同步问题。

3、handler的嵌套

因为我们团队进行的是博客园APP的开发,所以需要向博客园提供的API中发送不同请求。其中有些请求如下图所示。

可以看出它返回的博文列表是根据页码和页容量变化的,而且经过测试发现页容量最大是100。那么当博文列表多于100时,很显然需要增加页码的值,多次调用该API。而如我上文提到的发送请求调用API是需要新开一个线程的,这样就出现了第二个注意事项中提到的问题,多个handler同时进行调用。我们找到的解决办法时通过handler之间的嵌套解决。代码如下:

 ......
@SuppressLint("HandlerLeak")final Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg){
super.handleMessage(msg);
String text=(String)msg.obj;
@SuppressLint("HandlerLeak")final Handler handler1=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
String text=(String)msg.obj;
});
}
}
if(page>0) {
for(int i=0;i<page;i++){
getApi(handler1);
}
}
else{}
};
getApi(handler);

getApi为我们团队所写的发送Get请求的方法,其中传递了handler用来传递信息,在内部新开一个线程发送请求。

简单看一下上面代码的逻辑,首先进行到getApi,传递了handler,接着到handler的handleMessage中,得到返回的消息,进行逻辑判断,如果博客数量大于100,则page显然大于0,根据page数量继续调用getApi,但这次传递的是handler1,在handler1中的额handMessage方法中,得到了需要的数据,将它正常存储即可。这样一个简单的逻辑,在多次发送Get请求时,实则只有一个子线程进行运转,只有一个handler返回了信息,所以可以正确得到我们期望的返回信息。

【技术博客】利用handler实现线程之间的消息传递的更多相关文章

  1. [技术博客] 利用SharedPreferences来实现登录状态的记忆功能

    [技术博客] 利用SharedPreferences来实现登录状态的记忆功能 一.SharedPreferences简介 SharedPreferences是Android平台上一个轻量级的存储辅助类 ...

  2. [技术博客] 利用Vagrant+virtualbox在windows下进行linux开发

    目录 加速box安装的方法 root账户登录 换源教程 安装rvm 访问rails server RubyMine连接虚拟机上的解释器 作者:庄廓然 在windows下进行linux开发:利用Vagr ...

  3. [技术博客]利用第三方框架react-native-swipeout实现左右滑动出现按钮

    在之前的开发中,为了实现用户不同手势操作能够对应不同的功能,我们考虑使用React-Native的API--PanResponder,实现识别用户的手势,实现不同的功能.但我们很快就发现,这样简单的实 ...

  4. 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客

    上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...

  5. 技术博客——微信小程序的架构与原理

    技术博客--微信小程序的架构与原理 在两个月的微信小程序开发过程中,我曾走了不少弯路,也曾被很多现在看来十分可笑的问题所困扰.这些弯路与困扰,基本上都是由于当时对小程序的架构理解不够充分,对小程序的原 ...

  6. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  7. 【新版】Android技术博客精华汇总

    [新版]Android技术博客精华汇总(原文链接内持续更新) http://www.apkbus.com/thread-313856-1-1.html Kotlin Kotlin学习资料汇总 http ...

  8. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  9. 50家硅谷IT公司技术博客

    分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂   1. Facebook https://www.f ...

随机推荐

  1. 深入学习Composer原理(四)

    本系列第四篇文章,也是最后一篇 首先,我们先看看Composer的源码从哪里看起.当然,请您先准备好源码. composer init或者直接install之后,自动生成了一个vendor目录,这时您 ...

  2. 5cms使用sql语句给网站添加内容

    <!--list:{$Sql=UPDATE [{pre}Content] SET Indexpic="/uploadfile/201405/25/lsgjyst.jpg",t ...

  3. dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标

    大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...

  4. jquery中请求格式

    $.ajax({ url:"/ceshi/", type:"get", cache:false, dataType:"json", data ...

  5. JavaScript 原生控制元素添加删除

    参考: https://blog.csdn.net/leijie0322/article/details/80664554 https://www.cnblogs.com/jpfss/p/910620 ...

  6. 简述编写Django应用的基本步骤

    (1)创建项目,cd到一个你想要放置你代码的目录.Django -admin startproject mysite. Django project即一个Django项目实例需要的设置项的集合,包括数 ...

  7. spring Data Jpa的依赖+配置

    spring data jpa 是spring基于的orm框架,jpa规范的基础上封装的一套JPA应用框架 添加的相关依赖: <properties> <spring.version ...

  8. 鸿蒙内核源码分析(进程回收篇) | 老父亲如何向老祖宗临终托孤 ? | 百篇博客分析OpenHarmony源码 | v47.01

    百篇博客系列篇.本篇为: v47.xx 鸿蒙内核源码分析(进程回收篇) | 临终前如何向老祖宗托孤 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  9. P6624-[省选联考2020A卷]作业题【矩阵树定理,欧拉反演】

    正题 题目链接:https://www.luogu.com.cn/problem/P6624 题目大意 \(n\)个点的一张图,每条边有权值,一棵生成树的权值是所有边权和乘上边权的\(gcd\),即 ...

  10. Superedge的新特性和未来之路

    作者 王冬,腾讯云高级研发工程师,专注于Kubernetes.容器等云原生领域,SuperEdge 核心开发人员,现负责腾讯云边缘容器TKE Edge私有化相关工作. 背景 2021年9月27号,,在 ...