Android 性能优化的重要性~

news2024/10/6 8:33:45

随着移动设备和应用程序市场不断发展,Android应用程序变得越来越多,对于开发者来说,他们必须使自己的应用程序与其他应用程序相比更加高效和快速,以吸引用户和确保业务成功。而Android用户期望应用程序如同其他设备上的应用程序一样快速且无卡顿。低效的Android应用程序会导致用户体验差,使得用户会寻找其他更好的应用程序。

所以就导致了,目前市场对于Android开发性能优化技术的要求越来越高,主要表现在以下几个方面:

  1. 减少应用启动时间和响应时间。由于用户对于应用启动时间和响应时间的要求越来越高,因此需要开发者使用一些技术手段来减少应用启动时间和响应时间,如使用启动器缓存、使用异步加载、使用线程池等。
  2. 减少内存使用和提高性能。由于内存使用过多会导致应用性能下降和应用崩溃,因此需要开发者开发一些能够减少内存占用的技术,如使用内存优化库、减少不必要的对象创建等。
  3. 减少电量消耗。由于电量是智能手机的一个重要指标,因此需要开发者使用一些优化技术来减少电量消耗,如使用节能模式、减少网络请求等。
  4. 加强网络连接和优化传输速度。 Android应用需要持续连接网络来获取数据,因此要求开发者对于应用中的网络连接进行优化,如使用https协议、减少请求次数等。

在面试中,不少公司都会拿性能优化相关问题作为面试题,去考察开发者们的功底水平,比如常见的问题有

1.如何评估应用程序的性能?
2.Android 应用程序开发中使用过哪些性能优化技术?
3.如何利用 Android Profiler 工具来检测性能问题?
4.如何使用 LeakCanary 检测内存泄漏的?
5.如何使用 Lint 工具来检测潜在的性能问题?
6.如何避免在应用程序中使用非必要的内存?
7.如何降低应用程序的启动时间?
8.如何降低应用程序的网络请求时间?
9.如何避免造成UI线程阻塞?
10.如何处理大型数据集和长列表的性能问题?
11.……

如果你是面试者,你都能对答如流吗?

如何避免造成UI线程阻塞?

这种是非常普遍的问题了。在 Android 应用开发中,UI 线程(也就是主线程)负责处理用户的交互操作、响应系统的事件和更新 UI 界面等任务。由于这些任务需要在非常短的时间内完成,因此任何 UI 线程上的耗时操作都可能导致整个应用程序变得缓慢或崩溃。

为了避免造成 UI 线程阻塞,我们可以采取以下策略

1. 使用异步任务

在 Android 应用程序中,异步任务是执行一些耗时的操作并在完成后返回结果的一个常用方法。你可以使用 AsyncTasK 类来创建一个异步任务。

使用异步任务的主要目的是将长时间运行的任务分配给一个后台线程,并保证在执行期间不会干扰主线程的上下文。值得注意的是,异步任务只应该用来处理那些不需要太多CPU时间的异步操作,否则会导致 CPU 利用率过高,也会导致其他线程受到影响。因此,异步任务最适合用于处理网络或磁盘 I/O 操作或者 CPU 密集型计算。

2. 使用线程池

在应用开发的过程中,我们经常需要在后台进行多个任务的执行,比如从网络下载文件、解析数据或者压缩图片等。如果每个任务都用新线程来执行,就会导致大量线程在应用中被创建和销毁,从而会给系统带来压力。为了避免这种情况,我们可以使用线程池来管理后台线程。

线程池在设计上是复用线程的机制,它可以控制最大并发线程数,从而避免创建过多线程导致系统资源的浪费。线程池可以通过 ThreadPoolExecutor 或者 Executors 工具类进行创建。在创建线程池时,我们可以调整 corePoolSize,maximumPoolSize,keepAliveTime 等参数,以达到最优的线程池配置。

3. 使用 Handler

handler 是 Android 系统提供的用于传递 Message 和 Runnable 对象的轻量级机制。在应用程序中,我们可以创建一个 Handler 实例,并使用它来将一些任务发布到消息队列中,然后在后台线程中进行处理。

在实现中,我们可以使用 Looper.getMainLooper() 方法来获取主线程的 Looper,然后在这个 Looper 上创建一个 handler 对象。最后,我们将处理器关联到主线程上,就可以使用 post 和 postDelay 等方法来在主线程以外的线程中提交消息了。

与异步任务一样,handler 本质上还是将一些耗时的操作放到了后台线程中执行,并保证在 UI 线程中不会阻塞。但是,在使用 handler 时需要注意的是,如果你在主线程中提交了过多的任务,就会导致系统内存不足,甚至会不可避免地导致应用程序的崩溃。因此,在使用 handler 时,我们需要尽量避免在主线程中过多地提交任务。

4. 延迟加载

如果一个页面或视图包含大量数据或资源,我们可以采取延迟加载的策略,将数据或资源的加载与显示分离出来,等用户滚动或其他事件触发时再显示。这种方法可以有效地避免首次加载时 UI 线程的阻塞。

对于 ListView、GridView 或者 RecyclerView 等包含大量视图的组件,我们可以使用 setOnScrollListener 或者 RecyclerView.OnScrollListener 等方法来实现数据的分批加载。

5. 使用缓存

缓存对于 Android 应用程序的性能影响很大。在移动应用程序中,网络是一个主要瓶颈。因此,在应用程序中,我们应该尽可能地减少网络请求。

为了避免从网络或者本地存储器中重复获取数据,我们可以使用缓存技术。缓存可以分为内存缓存和磁盘缓存两种。在内存缓存中,我们可以使用 LruCache 或者 SparseArray 等类库;在磁盘缓存方面,我们可以使用 DiskLruCache 库或者输出流和输入流来处理。

总结

避免 UI 线程的阻塞是 Android 开发中的重要问题。常见的解决办法包括使用异步任务、线程池和 handler 等机制,以及延迟加载和使用缓存来避免重复获取数据。尤其是对于多次网络请求和大量数据处理的场景,使用这些技术可以大大提高应用的性能和用户体验。

如何降低应用程序的启动时间?

应用程序的启动时间是影响用户体验的重要因素之一,因此在开发Android应用程序时,需要重视应用程序的启动时间。为了降低应用程序的启动时间,我们可以采取以下措施:

1. 延迟加载

延迟加载可以避免在启动时加载不必要的数据或资源。例如,我们可以使用懒加载机制,在需要的时候再加载Fragment或View,而不是在启动时就全部加载。我们还可以使用分页加载机制,例如,在首次加载数据时只加载前面几条数据,在用户滚动到页面底部时再加载下一页数据。

2. 使用Splash界面

Splash界面是一种在应用程序启动时显示的过渡界面,通常用于显示应用程序的LOGO或欢迎语言等信息。通过使用Splash界面,我们可以将一部分启动时间移动到Splash界面显示时间,从而减少在应用程序主界面加载时的等待时间。但需要注意的是,Splash界面的显示时间应该尽可能短,以免影响用户体验。

3. 优化布局

布局的复杂度会影响应用程序的启动时间,因此我们需要尽可能简化布局。例如,可以使用约束布局代替传统的相对布局,使用LinearLayout代替RelativeLayout。此外还可以通过减少布局的嵌套层数、移除不必要的布局以及使用include标签等方式来优化布局,从而减少启动时间。

4. 减少I/O操作

I/O操作是应用程序启动时间的一个重要瓶颈。我们可以通过缓存数据、减少数据库操作、使用缓存机制等方式减少I/O操作来降低应用程序的启动时间。

5. 优化图片

图片文件通常比较大,因此它们的加载时间会对应用程序的启动时间产生很大的影响。我们可以通过优化图片压缩、使用WebP格式图片、减少图片的数量等方式来减少图片加载时间。

6. 使用多进程

使用多进程可以将部分启动时间移至后台,从而减少应用程序启动时间。但需要注意的是,使用多进程会对系统资源产生一定的开销,因此不应该滥用。

7. 启动完毕后再处理数据

我们可以在应用程序启动之后再加载数据或执行复杂的操作,以避免在启动时出现等待时间。例如,我们可以使用异步任务或Handler等机制,在应用程序启动完成之后再执行数据加载或复杂操作。

综上所述,降低应用程序打开的时间可以从多方面入手:延迟加载、优化布局、减少I/O操作、优化图片、使用多进程、启动完毕后再处理数据。通过这些措施,可以显著减少应用程序的启动时间,提高用户体验。

通过上述两题就可以看出性能优化中含杂了不少知识点,而大部分的开发者对其只是了解过,并不熟知,回答上来只有一个大概,但如果问题在涉及的深入一点,比如到Framework 底层哪块的话,就有点懵了。如果想将你的应用优化到极致,底层的知识是必不可少的。

其实你也可以想一下,简单的优化操作你会大家肯定也会,并没有什么竞争力,而想要提升你的竞争优势,就只有提升你的技术水平,会别人所不会的,比如全面精通性能优化技能,深入到底层的那种。

当然如果想要精进,不仅要知道如何利用工具做性能优化,还要对底层原理充分了解,对架构设计有一定经验

这样才算精通对某个领域的性能优化,精通意味着

  1. 在面试环节,性能就是最好的面试题,既能考察候选人的潜力,也能考察其工程能力;

  2. 在大厂晋升中,其他部门的高级专家在不熟悉候选人业务的情况下,只能去考察底层的硬核知识,而性能问题又是最有区分度的问题

当然,在一些面试中,也会看到一些朋友**写“精通性能优化”,**但是让其描述,往往就是一些自己编写的业务,一些去除页面多余嵌套、使用线程池、ViewStub 这些非常浅的方案。

我们更希望能听到,线上复杂环境,低端机/弱网等因素下,用户触发的一系列的体验问题。

想要搞清楚这些,那么必须对底层原理有着深度了解,对各种case非常丰富的经验;很多人经常遇到措手不及的问题,大多是对出现问题的情况和处理思路模糊不清,导致此这种情况的出现就是因为没有搞懂底层原理。

为了帮助到大家更好的全面清晰的掌握好性能优化,准备了相关的学习路线以及核心笔记(还该底层逻辑):https://qr18.cn/FVlo89

性能优化核心笔记:https://qr18.cn/FVlo89

启动优化

内存优化

UI优化

网络优化

Bitmap优化与图片压缩优化https://qr18.cn/FVlo89

多线程并发优化与数据传输效率优化

体积包优化

《Android 性能监控框架》:https://qr18.cn/FVlo89

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战
  12. ……

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

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

相关文章

PHP快速入门02-PHP语言基础

文章目录前言一、 数据类型1.1 String(字符串)1.2 Integer(整型)1.3 Float(浮点型)1.4 Boolean(布尔型)1.5 Array(数组)1.6 Object(对象&#xff…

[ vulnhub靶机通关篇 ] 渗透测试综合靶场 DC-5 通关详解 (附靶机搭建教程)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

深入了解Hugging Face Transformers库:NLP的转换之力

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

29岁,普通功能测试,我是如何在一周内拿到5份Offer的?

我有个朋友,29岁,功能测试已经2年有余,关于他的职业发展历程,以后会跟大家分享,今天主要想把他跟我分享的面试经历和经验分享给大家,帮助一些迷茫中的朋友。 最近,大概面试了7,8家公…

Redis -List

Redis List 本章介绍redis 的List的数据结构 Redis列表是字符串值的链表。Redis列表经常用于: 1、实现堆栈和队列 2、为后台工作系统提供队列管理 例如: 第一种情况,将List视为一种先进先出的队列 Treat a list like a queue (first in, fi…

Linux系统安装MySQL

使用wget命令下载安装包,命令: ​ wget http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz​ 1、查看是否已经安装MySQL: 命令: rpm -qa|grep -i mysql 我的Linux是没有安装过的&…

rk3568点亮LCD(mipi)

rk3568 Android11/12 适配 mipi 屏 MIPI (Mobile Industry Processor Interface) 是2003年由ARM, Nokia, ST ,TI等公司成立的一个联盟,目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性…

【Java版oj】day27不用加减乘除做加法、三角形

目录 一、不用加减乘除做加法 (1)原题再现 (2)问题分析 (3)完整代码 二、三角形 (1)原题再现 (2)问题分析 (3)完整代码 一、不用…

Midjourney V5太炸裂:逼真到颤抖!“有图有真相”时代彻底过去 画画创作者 模特一键淘汰

** ** 文章目录1、Midjourney V51.1、许多人纷纷惊呼:人类画师别活了。1.2、通用模型2、midjourney是什么3、midjourney 的使用方式4、Midjourney新手入门描述词5、一些疑难杂症1、Midjourney V5 继GPT-4发布之后,Midjourney V5上线。网友纷纷试玩&…

java学习之局部内部类

目录 一、内部类简介 二、内部类的分类 三、局部内部类 第一点 第二点 第三点 第四点 第五点 第六点 第七点 一、内部类简介 类的五大成员:属性、方法、构造器、代码块、内部类 package com.hspedu.innerclass;public class InnerClass01 {public static…

2023 年嵌入式世界的3 大趋势分析

目录 大家好,本文讲解了嵌入式发展的3个大趋势,分享给大家。 趋势#1 – Visual Studio Code Integration 趋势#2 –支持“现代”软件流程 趋势 #3 – 在设计中利用 AI 和 ML 结论 大家好,本文讲解了嵌入式发展的3个大趋势,分享…

1、Git使用不完全指南:GitHub的使用详解

GitHub 是一个以开源为基础的社交化编程平台,开发者可以在上面分享代码、协同开发、交流等。下面我们来讲一下如何使用 GitHub。 1. 注册 GitHub 账号 首先,我们需要在 GitHub 上注册一个账号,访问GitHub官网:GitHub: Let’s bui…

IDEA win11安装flutter环境

1.环境说明 操作系统:win11编辑器:Idea 2022.2.1Flutter:3.7.7JDK:17 2.安装 Flutter SDK 2.1安装flutter sdk flutter中文网 2.2配置环境变量 1)在环境变量path中加入flutter的安装路径:D:\DevelopT…

结合PCA降维的DBSCAN聚类方法(附Python代码)

目录 前言介绍: 1、PCA降维: (1)概念解释: (2)实现步骤: (3)优劣相关: 2、DBSCAN聚类: (1)概念解释&a…

关于镜头畸变问题的总结

1、问题背景最近在做的项目有畸变校正的需求,但测试镜头畸变时,发现畸变的形态不太正常。如下图所示中间向内凹、四周向外凸,感觉像是曲线型的。但常见的畸变就两种,一种是向内收的枕形畸变,另一种是向外凸的桶形畸变&…

SpringCloud:ElasticSearch之DSL查询文档

elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如…

第04章_IDEA的安装与使用(上)

第04章_IDEA的安装与使用(上) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种…

从二叉树角度看归并排序

归并排序本质上可以看作二叉树的后序遍历 里面用到的核心思想 > 分治 分:二叉树算法思想中的分解问题思想 治:链表中双指针技巧(将两条链表合并成一条有序链表) sort首先将数组分成左半边和右半边 > 然后分别对左右两…

Log库和配置系统结构

Log库: 类关系 首先有3个大类:LogEvent、LogAppender、Logger、LogFormat; 关系如下: Logger:具体log的实现 LogAppender:将Log信息传输到不同的目的地,根据不同的需求派生出不同的类 LogF…

Java 系列 Nacos

Java 系列文章 文章目录Java 系列文章前言一、Nacas 介绍及安装1. 什么是Nacos2. 为什么使用Nacos3. Nacos 下载和安装二、Nacos服务提供者注册1. Nacos代替Eureka2. Nacos服务注册中心3. Nacos Discovery引入1. 创建新项目2. POM3. YML文件4. 启动类5. 业务类6. 测试&#xff…