对于 Android 的性能优化,我们一般重视的都是启动速度、卡顿等较为明显的问题。然而在这些明显的问题之下还存在一些不明显但是难以线上定位的问题,比如这篇文章要说的线程。
为了提升主线程的响应性我们很正常的会创建异步线程来执行耗时任务,然而异步一定会使 App 整体的运行变快吗?尤其是任务非常密集的时候,你确定吗?
基于封装的思想以及统一管理的目的,项目中我们一般会提供一个线程池供所有研发同学使用,但是每一个任务不同的独特性决定了一个线程池是无法适应所有任务的执行。因此我们需要对任务进行分级,根据任务的不同来决定任务执行的线程池。
线程是可以设置优先级的,但是不合理的优先级设定只会加剧资源的争抢或者导致优先级设定不生效。
如果对于以上三个问题来说只是暗藏的问题的话,那这个 pthread_create 问题的表现则是崩溃,会直接影响用户的实际体验。而这类问题在实际用户使用的线上,是比较难以解决的。
对于线程收敛最重要的第一点就是要锁定目前项目中所有线程的创建者,包括了业务上的线程以及三方库中的线程。
接下来我们对项目中所使用到的异步方式进行封装,其中最主要的是线程池的封装,将线程池根据需要进行封装并且根据任务类型来区分,从而实现不同类型的任务执行于不同类型的线程池中。
项目中存在创建线程的地方非常多:原生线程池、封装线程池、AsyncTask、RxJava、IntentService、HandlerThread、野线程等等。首先要将线程创建这一步掌握住,否则无法进行线程收敛,那接下来的工作根本无法进行。
本文初步总结了 Android 项目中由线程引发的各种问题以及解决之道,有需要欢迎学习我的课程《国内Top团队大牛带你玩转Android性能分析与优化》。