文章目录

  • 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 的子类,它使用工作线程逐一处理所有启动请求。
如果不要求服务同时处理多个请求,这是最好的选择。
也就是

Android中的多线程(字节跳动)相关推荐

  1. Android中的网络(字节跳动)

    文章目录 RESTful API 对REST的解释 资源与URI 什么是URI HTTP URL的组成 Http 接口 JSON Http资源 XML JSON Android中对JSON的处理 方法 ...

  2. Android中的多线程编程与异步处理

    Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...

  3. 请画图说明tcp/ip协议栈_5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南 - Android木子李老师...

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...

  4. Android中的多线程

    文章目录 多线程 多线程的引入 模拟耗时任务 什么是主线程 什么是子线程 使用Handler处理多线程 Handler Handler的使用步骤 例子一 模拟进度条的加载 使用AsyncTask处理多 ...

  5. 人生中第一次面试-----字节跳动面试经验总结

    20190801 我经历了人生中的第一次面试,一面感觉还行,二面有点惨.(一面和二面是连在一起的),三面也很惨,四面也好惨.然后坚持到hr面. 未来的事情好多不确定,但是唯一要做的还是要不断充实自己, ...

  6. Android 中的多线程简介

    一.概念讲解 进程:是程序运行过程中系统进行资源分配和调度的一个独立单位,使多个程序可 并发执行,以提高系统的资源利用率和吞吐量. 线程:一个基本的CPU执行单元 & 程序执行流的最小单元. ...

  7. Android高级工程师面试题-字节跳动,含BATJM大厂

    其实如果你技术深度足够,大必不用为就业而忧愁.每个行业何尝不是这样,最开始的风口,到慢慢的成熟.Android初级在2020年的日子里风光不再, 靠会四大组件就能够获取到满意薪资的时代一去不复返.** ...

  8. (Android小应用)在Android中实现多线程断点下载(连载二)

    前面已经讲了通过多线程下载网络文件的一部分核心代码,下面继续做我们的项目 当然如果我们做小一点的Android项目的时候可以先做界面,然后根据需要来扩展所需要的功能,当然有的时候我们宁愿先实现业务,业 ...

  9. Android基础第六天 | 字节跳动第四届青训营笔记

    这是我参与「第四届青训营 」笔记创作活动的的第6天 端智能技术演进与实践 文章目录 端智能技术演进与实践 课程回顾 01 什么是端智能技术 1.1 端智能是什么? 1.2 为什么要做端智能? 1.3 ...

最新文章

  1. ESP8266的一些MicroPython基础实验
  2. 基于Spring Cloud实现微服务前后端系统
  3. 数字语音信号处理学习笔记——语音信号的短时时域分析(3)
  4. 数据科学竞赛-自然语言处理赛流程
  5. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...
  6. arcgis风向_[ArcGIS] 空间分析(六) 追踪分析(台风路径)
  7. Android 架构优化~MVP 架构改造
  8. vb导出mysql字段名_VB获取数据库字段名
  9. HTML5期末大作业:我的家乡网站设计——可以根据百度百科更换家乡适用多数我的家乡
  10. 网络历史之金融投资三剑客03
  11. 设计一个python程序来计算显示通过如图2-7所示的管道_python程序设计习题与答案...
  12. 某内容管理系统最最最详细的代码审计
  13. 支付业务与技术架构学习总结(7)——从金融牌照(三方支付牌照),看互联网巨头的金融布局
  14. 百度地图 ( 一 ) 显示地图
  15. FileNotFoundError: Could not find module ‘C:\Users\Yolanda\anaconda3\envs\python38\lib\site-packages
  16. Windows10 应用商店打不开问题,报错:Code: 0x80072F7D
  17. keepalived工作原理和配置说明
  18. 运营中心:网站分析、网络广告注释
  19. 3 Symmetry Group
  20. 极速下载git hub 客户端

热门文章

  1. JS 保持数组长度为3位并且值不重复
  2. Missing space before value for key 'path'vue.js解决空格报错
  3. iOS图片,视频上传视频内容旋转
  4. 16.1、python初识面向对象(1)
  5. 为什么vue.js一眼看上去很美?
  6. mysql中模糊查询的四种用法介绍
  7. 如何在Django中接收JSON格式的数据
  8. data pump工具
  9. 能和LoadRunner匹敌的VS2010/2012Web负载测试
  10. [转载] 信息系统项目管理师考试论文写作要点