当前位置: 首页 > 编程日记 > 正文

Android中的多线程(字节跳动)

文章目录

  • Handler机制(Android中的消息队列机制)
    • Handler机制为Android系统解决了以下两个问题
    • Handler常用方法
    • Handler的使用
    • 补充知识点
    • Handler原理
    • 辨析Runnable/Message
    • 扩展知识:ANR
    • Handler总结
  • Android中的多线程
    • 概念:进程与线程(Process and Thread)
    • Android中的5类常用线程
    • Thread
    • 线程池 ThreadPool
      • 为什么要用线程池
      • 几种常见线程池
    • AsyncTask
      • AsyncTask中的重要函数
      • AsyncTask中的参数对应关系
    • HandlerThread
    • IntentService
      • Service
      • IntentService

Handler机制(Android中的消息队列机制)

Handler机制为Android系统解决了以下两个问题

  1. 调度(Schedule)Android系统在某个时间点执行特定的任务
    特定的任务可以表示成
    a. Message(android.os.Message)
    b. Runnable(java.lang.Runnable)
  2. 将需要执行的任务加入到用户创建的线程的任务队列中
    可以理解成:Handler可用于进行线程间的通信

Handler常用方法

// 立即发送消息
public final boolean sendMessage(Message msg)
public final boolean post(Runnable r);// 延时发送消息(未来)
//delayMillis是要延迟的时间,单位为毫秒
public final boolean sendMessageDelayed(Message msg, long delayMillis)
public final boolean postDelayed(Runnable r, long delayMillis);// 定时发送消息(定时可以取代延时,现在时间+延迟时间)
//传的时间参数是时间戳而不是一个时间差值
public boolean sendMessageAtTime(Message msg, long uptimeMillis);
public final boolean postAtTime(Runnable r, long uptimeMillis);
public final boolean postAtTime(Runnable r, Object token, long uptimeMillis);// 取消消息
public final void removeCallbacks(Runnable r);
public final void removeMessages(int what);//整形代表着唯一标志,是message的属性
public final void removeCallbacksAndMessages(Object token);//取消全都取消

Handler的使用

  1. 调度Message
    新建一个Handler,实现handleMessage()方法(接收消息)
    在适当的时候给上面的Handler发送消息

  2. 调度Runnable
    新建一个Handler,然后直接调度Runnable即可

  3. 取消调度
    通过Handler取消已经发送过的Message/Runnable

补充知识点

主线程也叫UI线程
Android中,UI控件并非是线程安全的,只能在主线程内调用,所以所有对于UI控件的调用,必须在主线程
因此,通常我们也把主线程也叫做UI线程。

下载视频不可以在主线程,时间过长可能阻塞主线程。
两个进程间的通信还是要使用Handler。一般主线程接收msg,因为能进行UI的更新。

Handler原理

消息队列机制本质上是生产者-消费者模型
生产者有用户操作、系统事件、其他等
消费者是UI线程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Handler使用sendMessage发送消息,使用HandleMessage处理消息
使用消息队列MessageQueue存储消息
Looper管理消息队列,是一个无限循环,调用loop()方法调出当前要被处理的任务,一有消息,立刻取出

辨析Runnable/Message

观察下面两个实现同样功能的方法:
在这里插入图片描述
在这里插入图片描述
Runnable更简洁
但是当有多个任务,使用Message更清晰
没有绝对好坏,根据实际情况选择。

Runnable本质上是Message
在这里插入图片描述

扩展知识:ANR

主线程执行耗时操作,导致长时间无响应可能出现ANR(Application Not Responding)
耗时操作:如文件读写时,又来了消息,长时间得不到执行
在这里插入图片描述

Handler总结

Handler就是Android中的消息队列机制的一个应用,可理解为是一种生产者消费者的模型,解决了Android中的线程内&线程间的任务调度问题;

Handler的本质就是一个死循环,待处理的Message加到队列里面,Looper负责轮询执行;

掌握Handler的基本用法:立即/延时/定时发送消息、取消消息。

Android中的多线程

概念:进程与线程(Process and Thread)

进程:
具有一定独立功能的程序关于某个数据集合的一次运行活动
是操作系统动态执行的基本单元
在传统的操作系统中,进程既是基本的分配(资源)单元,也是基本的执行(调度)单元
一般情况下,android中的一个app是一个进程(一个app也可以是多个进程,但是需要手动开启)

线程:
操作系统能够进行运算调度的最小单位
它被包含在进程之中,是进程中的实际运作单位

Android中的5类常用线程

在这里插入图片描述
前两个类是Java中的,后三个是Android中独有的类
AsyncTask最常用

Thread

一个简单的Thread的例子
在这里插入图片描述
怎样优雅的启动和停止一个Thread
在这里插入图片描述

线程池 ThreadPool

为什么要用线程池

新建和销毁线程,如此一来会大大降低系统的效率
而线程是可以重用的

几种常见线程池

在这里插入图片描述

AsyncTask

AsyncTask中的重要函数

在这里插入图片描述

AsyncTask中的参数对应关系

在这里插入图片描述

HandlerThread

本质:继承Thread类 & 封装Handler类

IntentService

Service

Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。

IntentService

IntentService 是 Service 的子类,它使用工作线程逐一处理所有启动请求。
如果不要求服务同时处理多个请求,这是最好的选择。
也就是
在这里插入图片描述

相关文章:

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator

一、前言 利用FPGA设计算法一直以来都是热点,同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen(system generator)工具扩展了MATLAB的simul…

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况

前言: 帮客户做一个订单系统,需要一个日期1,一个日期2,默认情况下日期1为当天,日期2为明天,只是当时有些疑惑的是日期2偶尔会出现NAN的情况,今天在segmentfault.com看到了同样的问题&#xff0c…

VCL 中的 Windows API 函数(6): BeginDeferWindowPos

BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.本例效果图:代码文件:unit Un…

base64格式的图片数据如何转成图片

base64格式的图片数据如何转成图片 一、总结 一句话总结:不仅要去掉前面的格式串,还需要base64_decode()解码才行。 1 // $base_img是获取到前端传递的值2 $base_img str_replace(data:image/jpg;base64,, , $base_img);3 // 设…

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能。 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对…

代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析

1.以类取代类型码 适用情况:类之中有一个数值类型码,但它并不影响类的行为。 重构手段:以一个新的类替换该数值类型码。 重构类图示意: 这里的“不影响类的行为”是什么意思呢? 类型码往往和switch语句一起出现&#…

NHibernate之旅(11):探索多对多关系及其关联查询

本节内容 多对多关系引入多对多映射关系多对多关联查询1.原生SQL关联查询2.HQL关联查询3.Criteria API关联查询结语多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Ord…

自动化运维—saltstack

2019独角兽企业重金招聘Python工程师标准>>> 自动化运维——saltstack 、ansible 一、自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁琐,容易出错,每日重复做相同的事情,…

史上最浅显易懂的Git教程!

Git初学者很好的一篇教程 mark : ) http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 转载于:https://www.cnblogs.com/anthony0859/p/3900327.html

狎昵关系和依恋情结辨诠

Inappropriate Intimacy(狎昵关系) 表现:两个classes过于亲密,花费太多时间去探究彼此的private成分 解决:你可以采用 Move Method 和 Move Field 帮它们划清界线,从而减少狎昵行径。你也可以看看是否运用…

win2000.win2003关闭端口详解--防黑必备

我相信有很多人都不知道自己开了什么端口.更加不知道怎么关闭端口. 你可以用查看端口的软件查看. 也可以通过在运行里输入"cmd" 在弹出的cmd命令行里输入 netstat -an 来查看自己开放端口.ip地址的后面的就是端口号. 以下是我自己写的一篇关于关闭端口的详细步骤和多…

网站基于vs,复选框,单选款

前端代码&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Default2.aspx.cs" Inherits"Default2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or…

thinphp 整合ueditor

我的ueditor是部署在public/editor 部署前台页面 <script type"text/javascript" > var UEDITOR_HOME_URL: "__PUBLIC__/ueditor/" </script><script id"container" name"$des" type"text/plain">这里写你…

笔画宽度变化(C++和matlab算法)

最近一直在看工作方面的书籍&#xff0c;把论文的事情搁置了&#xff0c;之前承诺的贴代码的事一直拖。现在把代码整理发上来&#xff0c;只有核心部分的&#xff0c;都不是我写的&#xff0c;我是网上整理下载的&#xff0c;matlab代码的效果比较差。 全部文件网盘下载地址:ht…

bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)

传送门 首先&#xff0c;对于每一块墓地&#xff0c;如果上下左右各有$a,b,c,d$棵树&#xff0c;那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散&#xff0c;然后按$x$为第一关键字&#xff0c;$y$为第二关键字&#xff0c;那么同一横坐标的一定在…

[导入]源代码版本控制(一)

开发过程当中源代码的版本控制一直是个大问题。项目规模小了还好办&#xff0c;人的脑子还能记过来&#xff0c;项目大了&#xff0c;可能用各式各样的表格来记录版本信息和源代码内容&#xff0c;但这个办法本身的文档组织又是个问题&#xff0c;谁来维护&#xff1f;谁来更改…

重构技巧分别能够解决哪些代码味道

1.提炼类可以解决的5种代码味道&#xff1a; 过大类 重复代码 基本类型偏执 令人迷惑的暂时值域 狎昵关系 2.将类内联化可以解决的3种代码味道 冗赘类 夸夸其谈的未来性 霰弹式修改 3.隐藏委托关系解决的2种代码味道 狎昵关系 过度耦合的消息链 4.复制被监视的数据 过大类 5.以…

python爬取电影和美食数据实战

本文使用的是requests正则来匹配网页内容&#xff0c;对于数据量较多的采用了多线程抓取的方法&#xff0c;共3个案例&#xff0c;分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。1、首先选择想要爬取的网站2、确…

Asp.Net页面执行流程分析

在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用&#xff0c;我们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx页面请求时后台到底做了什么&#xff1f;当然asp.net做了很多事情&#xff0c;过程也比较复杂&#xff0c;本文主要分析一下大…

正则验证非法字符

function regText(text){var reg /^[\s\u4e00-\u9fa5a-z0-9_-]{0,}$/;if(!reg.exec(text)){console.log("非法字符")}else{console.log("有效字符")} } regText("abc") 验证 &#xff1a;汉字、英文、数字、下划线、中划线、空格 转载于:https…

活动排序工具之双代号网络(AOA)与单代号网络(AON)[cont.]

箭线图ADM/双代号网络AOA 图示 箭线表示活动 节点表示一个活动的开始或结束 三要素&#xff1a;结点、箭线、线路 唯一使用虚活动的活动排序工具&#xff0c;虚活动用虚线箭头表示&#xff0c;没有历时&#xff0c;不需资源&#xff0c;只表达活动关系的需要 只使用一种活动之…

并发任务的可视化

一、任务要求&#xff1a;在linux系统中设计一个父进程&#xff0c;三个子进程(A,B,C)。子进程A,B同时被父进程启动来计算&#xff08;不实现具体的计算任务&#xff0c;先用CPU空跑来代替&#xff09;。进程A计算5分钟&#xff0c;而进程B计算8分钟。当进程A,B都计算完成后才能…

银监会警示担保圈贷款风险 联保贷款变异 防多米诺效应

互保联保本是解决小微企业以及农村金融贷款需求的重要创新&#xff0c;但却在部分行业、部分地区逐渐变异&#xff0c;成为引发风险事件的诱因。 据媒体报道&#xff0c;银监会近日发文要求加强企业担保圈贷款风险的防范和化解工作。银监会警示&#xff0c;担保圈企业风险较高的…

SharePoint 2007 系列(4) -Site Settings

Site administration 转载于:https://www.cnblogs.com/xuxiaoguang/archive/2008/11/05/1326913.html

软件项目管理重点总结

文章目录概论走进项目管理把控环境&#xff0c;控制过程整合项目资源控制项目范围保障项目进度驾驭项目成本保证项目质量协调项目人力资源改善项目的沟通应对项目风险关注项目的采购和外包概论 项目的定义&#xff1a;为创造一个特定的产品、服务或者成果而采取的临时性的努力…

jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误

当使用jquery1.3以上版本时&#xff0c;进行ajax参数传值时&#xff0c;会出现以下的一个错误: ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, column 3. 这个错…

数据绑定以及Container.DataItem绑定技巧

数据绑定以及Container.DataItem绑定技巧 灵活的运用数据绑定操作绑定到简单属性:<%#UserName%>绑定到集合:<asp:ListBox id"ListBox1" datasource<%# myArray%> runat"server">绑定到表达式:<%#(class1.property1.ToString() "…

LeetCode 76. Minimum Window Substring / 567. Permutation in String

76. Minimum Window Substring 典型Sliding Window的问题&#xff0c;维护一个区间&#xff0c;当区间满足要求则进行比较选择较小的字串&#xff0c;重新修改start位置。 思路虽然不难&#xff0c;但是如何判断当前区间是否包含所有t中的字符是一个难点&#xff08;t中字符有重…