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

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的多线程(字节跳动)相关的知识,希望对你有一定的参考价值。

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中的多线程(字节跳动)的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动提前批-Android开发一面

字节跳动提前批-Android开发一面

字节跳动提前批-Android开发一面

字节跳动的多平台绽放秘诀 | Flutter 开发者故事

字节跳动Android实习面试凉凉经

字节跳动基于 Apache Hudi 的多流拼接实践方案