Android官方开发文档Training系列课程中文版:线程执行操作之线程间通讯

原文地址:http://android.xsoftlab.net/training/multiple-threads/communicate-ui.html

上节课我们学习了如何启动一项由ThreadPoolExecutor所管理的线程任务。最后这节课我们将学习如何从任务中发送结果数据给UI线程。这项手段可以使任务在执行完毕后将结果显示到UI中去。

每个APP拥有独立的UI线程。只有在UI线程中创建的对象才可以访问该线程中的其它对象。正因为运行任务的线程不是UI线程,所以它们不可以直接访问UI对象。为了将数据从后台线程转移到UI线程,需要使用运行在UI线程中的Handler对象。

在UI线程中定义Handler

Handler是Android系统框架管理线程的一部分。Handler对象专门用于接收消息处理消息。 一般来说,可以为新线程创建一个Handler,也可以为一个已经连接好的线程创建Handler。当你将Handler连接到UI线程时,处理消息的代码都会运行在UI线程中。

在构建线程池的类的构造方法中实例化一个Handler对象,并将该对象的引用存储于全局变量中。通过Handler(Looper)重载构造方法所实例化Handler可以与UI线程产生关联。这个构造方法所使用的Looper参数是Android系统的线程管理框架的另一部分。当以指定的Looper实例初始化一个Handler对象时,Handler对象会运行在Looper对象所在的线程中。

private PhotoManager() {
...// Defines a Handler object that's attached to the UI threadmHandler = new Handler(Looper.getMainLooper()) {...

在Handler内,重写handleMessage()方法。Android系统会在Handler所管理的线程中接收到一条新的消息时回调该方法:

        /** handleMessage() defines the operations to perform when* the Handler receives a new Message to process.*/@Overridepublic void handleMessage(Message inputMessage) {// Gets the image task from the incoming Message object.PhotoTask photoTask = (PhotoTask) inputMessage.obj;...}...}
}

将数据从非UI线程转移到UI线程

为了将数据从后台进程转移到UI进程,首先将数据的引用以及UI对象存储于任务对象中。接下来,将该任务对象及状态码传给由Handler对象所初始化的对象。在这个对象内,发送一条包含状态码的任务对象给Handler。因为Handler是运行在UI线程的,所以它可以将数据交给UI对象。

存储数据于任务对象中

举个例子,这里有一个Runnable对象,运行于后台线程,它用于解码一个Bitmap对象,并将其存储于它所属的对象PhotoTask中。该Runnable还会存储一个状态码:DECODE_STATE_COMPLETED。

// A class that decodes photo files into Bitmaps
class PhotoDecodeRunnable implements Runnable {...PhotoDecodeRunnable(PhotoTask downloadTask) {mPhotoTask = downloadTask;}...// Gets the downloaded byte arraybyte[] imageBuffer = mPhotoTask.getByteBuffer();...// Runs the code for this taskpublic void run() {...// Tries to decode the image bufferreturnBitmap = BitmapFactory.decodeByteArray(imageBuffer,0,imageBuffer.length,bitmapOptions);...// Sets the ImageView BitmapmPhotoTask.setImage(returnBitmap);// Reports a status of "completed"mPhotoTask.handleDecodeState(DECODE_STATE_COMPLETED);...}...
}
...

PhotoTask还包含了一个用于展示Bitmap的ImageView的句柄。尽管引用Bitmap以及ImageView的是同一个对象,但是还是不能将Bitmap赋值给ImageView,因为当前并没有处在UI线程中。

发送状态到对象层级

PhotoTask在层级内处于第二高度。它维护了图像的解码数据以及一个View对象。它会接收PhotoDecodeRunnable中的状态码,并将其传给维护线程池以及Handler的那个对象。

public class PhotoTask {...// Gets a handle to the object that creates the thread poolssPhotoManager = PhotoManager.getInstance();...public void handleDecodeState(int state) {int outState;// Converts the decode state to the overall state.switch(state) {case PhotoDecodeRunnable.DECODE_STATE_COMPLETED:outState = PhotoManager.TASK_COMPLETE;break;...}...// Calls the generalized state methodhandleState(outState);}...// Passes the state to PhotoManagervoid handleState(int state) {/** Passes a handle to this task and the* current state to the class that created* the thread pools*/sPhotoManager.handleState(this, state);}...
}

将数据展示到UI

PhotoManager收到从PhotoTask中发来的状态码,然后处理这个PhotoTask对象。因为状态是TASK_COMPLETE,所以先创建一个Message,然后通过这个Message对象将状态以及人物对象发送给Handler:

public class PhotoManager {...// Handle status messages from taskspublic void handleState(PhotoTask photoTask, int state) {switch (state) {...// The task finished downloading and decoding the imagecase TASK_COMPLETE:/** Creates a message for the Handler* with the state and the task object*/Message completeMessage =mHandler.obtainMessage(state, photoTask);completeMessage.sendToTarget();break;...}...}

最后,在Handler.handleMessage()中检查每条消息的状态。如果消息的状态为TASK_COMPLETE,那么表明该任务已经终结,那么Message中所包含的PhotoTask对象包含了一个Bitmap以及一个ImageView。因为Handler.handleMessage()是运行在UI线程的,所以它可以安全的将Bitmap赋给ImageView:

    private PhotoManager() {...mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message inputMessage) {// Gets the task from the incoming Message object.PhotoTask photoTask = (PhotoTask) inputMessage.obj;// Gets the ImageView for this taskPhotoView localView = photoTask.getPhotoView();...switch (inputMessage.what) {...// The decoding is donecase TASK_COMPLETE:/** Moves the Bitmap from the task* to the View*/localView.setImageBitmap(photoTask.getImage());break;...default:/** Pass along other messages from the UI*/super.handleMessage(inputMessage);}...}...}...}
...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL解析在美团的应用

数据库作为核心的基础组件,是需要重点保护的对象。任何一个线上的不慎操作,都有可能给数据库带来严重的故障,从而给业务造成巨大的损失。为了避免这种损失,一般会在管理上下功夫。比如为研发人员制定数据库开发规范;新…

无内鬼,来点ICML/ACL审稿人笑话

文 | Sheryc_王苏最近,如果你的小伙伴突然没时间陪你出来玩了,请不要担心,ta可能正在与ICML/IJCAI/ACL的审稿人斗智斗勇。过去的一周里,机器学习顶会ICML、人工智能顶会IJCAI和NLP顶会ACL扎堆放出审稿人意见,有人欢喜有…

Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at

Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at:https://blog.csdn.net/python__reported/article/details/106318330 Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at 一、报错内容二、解决方法 一、报错内容 报错&a…

LeetCode 148. 排序链表(归并排序、快速排序)

文章目录1. 题目2. 解题2.1 归并排序2.2 快速排序1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1:输入: 4->2->1->3 输出: 1->2->3->4 示例 2:输入: -1->5->3->4->0 输出: -1->0->3->4-&…

论文浅尝 | 基于对抗学习的弱监督知识图谱对齐

论文笔记整理:郭凌冰,浙江大学研究助理,研究方向为知识图谱的表示学习。绝大部分现有的知识图谱对齐方法都要求足够的已对齐三元组作为监督数据,但在现实世界中,获取大量的对齐三元组的代价十分高昂。本文提出一种同时…

美团数据平台Kerberos优化实战

背景 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户端、服务器端的应用程序提供强大的认证服务。 作为一种可信任的第三方认证服务,Kerberos是通过传统的密码技术(如:共享密钥)执行认证服务的&#xff…

Android官方开发文档Training系列课程中文版:如何避免ANR?

原文地址:http://android.xsoftlab.net/training/articles/perf-anr.html#anr 尽管你写代码可能通过了世界上所有的性能测试,但是它还是可能会让人感觉到卡顿。当应用卡的不成样子时,系统会给你弹一个”Application Not Responding”的对话框…

预训练语言模型真的是世界模型?

文 | 子龙自GPT、BERT问世以来,预训练语言模型在NLP领域大放异彩,刷新了无数榜单,成为当前学界业界的心头爱,其主体结构——Transformer——也在逐步的运用于其他领域的任务中,常见的如与CV的跨界,也有相对…

monk js_对象检测-使用Monk AI进行文档布局分析

原文链接:https://blog.csdn.net/weixin_26752075/article/details/108494230 monk js 计算机视觉 (Computer Vision) 介绍 (Introduction) This is an article on how Object Detection can help us in predicting various regions of a document. It can be usefu…

LeetCode 2019 力扣杯全国秋季编程大赛

文章目录1. 比赛结果2. 题目解析2.1 猜数字 Easy2.2 分式化简 Esay2.3 机器人大冒险 Medium2.4 覆盖 Hard2.5 发 LeetCoin Hard1. 比赛结果 2019.9.24晚,第一次参加线上比赛 比赛排名结果:582/1541,做出了2道题。。。 我证明了:…

美团广告实时索引的设计与实现

背景 在线广告是互联网行业常见的商业变现方式。从工程角度看,广告索引的结构和实现方式直接决定了整个系统的服务性能。本文以美团的搜索广告系统为蓝本,与读者一起探讨广告系统的工程奥秘。 领域问题 广告索引需具备以下基本特性: 层次化的…

论文浅尝 - AAAI2020 | 多通道反向词典模型

论文笔记整理:朱珈徵,天津大学硕士,自然语言处理方向。链接:https://arxiv.org/pdf/1912.08441.pdf动机反向词典将一段描述作为输入,并一起输出与该描述匹配的其他词,具有重要实用价值和自然语言处理研究价…

Android官方开发文档Training系列课程中文版:Android的JNI相关

原文地址:http://android.xsoftlab.net/training/articles/perf-jni.html JNI的全称为Java Native Interface,中文意思是Java本地接口。它定义了Java代码与C/C代码之间的交互方式。它是两者的桥梁,支持从动态共享库中加载代码。虽然有些复杂…

拒绝暴力调参!推荐一个模型Debug神器!

近些年深度学习在视觉、自然语言处理、语音等各个技术方向都诞生了不少创新应用,如智能识别医疗图像中的病灶,辅助医生做病情诊断;智能判别生产线上有质量问题的产品,减轻人工质检压力;对政务、金融等流程中的证件票据…

TIFF图像被转换为​​JPEG格式的图像

TIFF图像被转换为​​JPEG格式的图像。 for name in glob.glob(root_dirimg_dir*.tif): im Image.open(name) name str(name).rstrip(".tif") name str(name).lstrip(root_dir) name str(name).lstrip(img_dir) im.save(final_root_di…

Android官方开发文档Training系列课程中文版:Android的安全建议

原文地址:http://android.xsoftlab.net/training/articles/security-tips.html Android系统内置的安全策略可以有效的降低应用程序的安全问题。所以默认创建的应用程序已经包含了一定程度的安全保护措施。 Android所包含的安全策略有: 应用程序沙箱&a…

论文浅尝 - IJCAI2020 | Mucko:基于事实的多层跨模态知识推理视觉问答

论文笔记整理:陈卓,浙江大学计算机科学与技术系,博士研究生。论文链接:https://arxiv.org/pdf/2006.09073代码:https://github.com/astro-zihao/mucko发表会议:IJCAI 2020任务定义及背景VQA(视觉…

LeetCode 40. 组合总和 II(排列组合 回溯)

1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重…

质量运营在智能支付业务测试中的初步实践

背景 毋庸置疑,质量是决定产品能否成功、企业能否持续发展的关键因素之一。对于“质量时代”下的互联网企业,如何在快速迭代的节奏中兼顾质量,真正落地“人人重视质量、人人创造质量、人人享受质量”,这是对QA的要求,也…

新手手册:Pytorch分布式训练

文 | 花花机器学习算法与自然语言处理单位 | SenseTime 算法研究员目录0X01 分布式并行训练概述0X02 Pytorch分布式数据并行0X03 手把手渐进式实战A. 单机单卡B. 单机多卡DPC. 多机多卡DDPD. Launch / Slurm 调度方式0X04 完整框架 Distribuuuu0X05 Reference文中所有教学代码和…