[读书笔记]《Android开发艺术探索》第十五章笔记

Android 开发艺术探索 - 读书笔记目录 仅作为读书笔记使用,建议阅读原书。 书中代码部分已和现版本不符,建议对比最新版本学习。 读了这本书,越发认识到和大佬们的差距。嗯,加油吧。 过去の自分が今仆の土台となる [第 1 章 - Activity 的生命周期和启动模式] 第 2 章 - IPC 机制 第 3 章 - View 的事件体系 [第 4 章 - View 的工作原理] 第 5 章 - 理解 R... 阅读详情

Android性能优化


Android不可能无限制的使用内存和CPU资源,过多的使用内存会导致内存溢出,即OOM。而过多的使用CPU资源,一般是指做大量的耗时任务,会导致手机变的卡顿甚至出现程序无法响应的情况,即ANR。

15.1.1布局优化

1、如何进行布局优化?

  • 首先删除布局中无用的控件和层级
  • 其次有选择的使用性能较低的ViewGroup。
  • 布局优化的另一种手段是采用标签、标签、ViewStub。标签主要用于布局重用,标签一般和配合使用,它可以降低减少布局的层级,而ViewStub则提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,提高了程序的初始化效率。

2、标签只支持android:layout_开头的属性,android:id属性例外。

3、ViewStub继承了View,它非常轻量级且宽/高都是0,因此它本身并不参与任何的布局和绘制过程。ViewStub的意义在于按需加载所需的布局文件,在实际开发中,有很多布局文件在正常情况下不会显示,比如网络异常时的界面,这个时候就没有必要在整个界面初始化的时候将其加载起来,通过ViewStub就可以做到在使用的时候再加载,提高了程序初始化的性能。

如下所示,android:id是ViewStub的id,而android:inflatedId是布局的根元素的id。

<ViewStub android:id="@+id/xxx"
  android:inflatedId="@+id/yyy"
  android:layout="@layout/zzz"
  ...
</ViewStub>

需要加载ViewStub中的布局的时候,可以按照如下两种方式进行:

((ViewStub)findViewById(R.id.xx)).setVisibility(View.VISIBLE);

或者

View importPanel = ((ViewStub)findViewById(R.id.stub_import)).inflate();

15.1.1绘制优化

绘制优化是指View的onDraw方法要避免执行大量的操作:

  • 在onDraw中不要创建新的局部对象,这是因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁的gc,降低了程序的执行效率。
  • onDraw方法中不要指定耗时任务,也不能执行成千上万次的循环操作,View的绘制帧率保证60fps是最佳的,这就要求每帧的绘制时间不超过16ms,虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法的复杂度总是切实有效的。

15.1.3内存泄漏优化

可能导致内存泄漏的场景很多,例如静态变量、单例模式、属性动画、AsyncTask、Handler等等

15.1.4响应速度优化和ANR日志分析

  1. ANR出现的情况:Activity如果5秒内没有响应屏幕触摸事件或者键盘输入事件就会ANR。而BroadcastReceiver如果10s没有执行完操作也会出现ANR。
  2. 当一个进程发生了ANR之后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位ANR的原因。

15.1.5ListView和Bitmap优化

  1. ListView优化:采用ViewHolder并避免在getView方法中执行耗时操作;根据列表的滑动状态来绘制任务的执行效率;可以尝试开启硬件加速期来使ListView的滑动更加流畅。
  2. Bitmap优化:根据需要对图片进行采样,主要是通过BitmapFactory.Options来根据需要对图片进行采样,采样主要用到了BitmapFactory.Options的inSampleSize参数。

15.1.6线程优化

  1. 采用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销,同时线程池还能有效的控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生。

15.1.7一些性能优化建议

  • 避免 创建过多的对象
  • 不要过多的使用枚举,枚举占用的内存空间要比整形大
  • 常量请用static final来修饰
  • 使用一些Android特有的数据结构,比如SparseArray和Pair等,它们都具有更好的性能
  • 适当使用软引用和弱引用
  • 采用内存缓存和磁盘缓存
  • 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏

15.2内存泄漏分析之MAT工具

MAT是功能强大的内存分析工具,主要有Histograms和Dominator Tree等功能

15.3提高程序的可维护性

  1. 命名要规范,要能正确地传达出变量或者方法的含义,少用缩写,关于变量的前缀可以参考Android源码的命名方式,比如私有成员以m开头,静态成员以s开头,常量则全部用大写字母表示,等等。
  2. 代码的排版上需要留出合理的空白来区分不同的代码块,其中同类变量的声明要放在一起,两类变量之间要留出一行空白作为区分。
  3. 合理的命名风格,仅在非常关键的代码添加注释。
类银河恶魔城学习记录1-1 Player状态机的搭建 P28 什么是状态机?一篇文章就够了 - 知乎说实话,目前并不能深入理解状态机的奇妙之处(当然,我觉得状态机作为教程的重要组成部分是不得不理解的,所以以下我会对游戏教程内的状态机做一些我认为的解释,如有错误,请多包涵) 阅读详情

相关推荐

MySQL 分库分表及其平滑扩容方案

MyCAT不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。分表对于一张多行(记录)多列(字段)的二维数据表,又分两种情形(1)垂直分表竖向切分,不同分表存储不同的字段,可以把不常用或者大容量、或者不同业务的字段拆分出去;扩容前每个节点的数据,有一半要迁移至一个新增节点中,对应关系比较简单。此时,四个节点的数据都已完整,只是有冗余(多存了和自己配对的节点的那部分数据),择机清除即可(过后随时进行,不影响业务)。...

m0_71777195的博客 1929

android开发艺术探索(一)

首先呢,第一章的内容主要讲了activity的声明周期,activity的启动模式以及IntentFitter的匹配规则。这里对于activity的声明周期就没有必要说了,我们就说一下activity的状态保存。 1.activity被意外销毁怎么处理?当我们的activit由于内存不足被系统回收或者是意外原因(如屏幕旋转)销毁重建。这个时候我们需要重写onSaveInstanceState()方法

qq_14962167的博客 500

你不必懂AI,但必须会用AI:写给所有焦虑中的职场人

AI时代不必焦虑学技术,关键在于用AI解决实际问题。文章指出,99%的人只需成为AI使用者而非建造者,核心竞争力在于结合业务痛点运用AI工具提升效率。与其盲目学习工具,不如梳理工作流程,识别可优化环节,让AI赋能重复性、标准化任务。行业经验与AI工具的结合才是真正的职场护城河。建议从具体工作场景出发,寻找匹配的AI解决方案,迈出应用第一步。

hundred98的博客 715

《Android开发艺术探索》读书笔记 (15) Android性能优化

前言 笔者在新公司,前两个月做的最多的就是改BUG,熟悉项目,性能优化,其中也经历了不少坑。昨日翻书才发现,其实原来书里面都已经为你总结好了。 不过在有了一番性能优化经验后,对于书上所描述的问题领悟便更深刻了一点。其实一般性能优化在笔者遇到的情况看来,无外乎就是解决ANR(也包含由于OOM导致的ANR)和OOM的问题,这其实就是因为一些书写代码质量问题,比如说:嵌套布局过于复杂,bitmap使用的时

qq_28690547的博客 515

BSL编程语言 —— 系统化程序设计

BSL编程语言简介 文章目录0. 选择编程语言1. 写简单的表达式(Expression) 0. 选择编程语言 如果你第一次使用DrRacket,打开后需要选择Beginning Student Language (BSL) Language -> Choose Language (或直接按Ctrl + L),看到如下洁面后选择Beginning Student,点击OK 定义区【De...

CSDoneRight的博客 6450

利用BMC和KVM远程安装联想服务器Ubuntu 22.04的完整指南

本文提供了一份详尽的指南,介绍如何利用联想服务器的BMC(基板管理控制器)和KVM(键盘、视频、鼠标)重定向功能,远程安装Ubuntu 22.04 LTS操作系统。内容涵盖从准备工作(如获取BMC信息、配置Java环境)、登录BMC并启动远程控制台,到挂载ISO镜像、设置引导以及完成Ubuntu安装与后续配置的全过程。该方法能极大提升服务器部署与运维效率,尤其适用于无法物理接触服务器的场景。

p8q9r0的博客 620

第15章 Android启动过程 [Android应用开发与系统改造实战]

15.1 Android初始化语言(init.*.rc、init.conf文件格式)的英文档在system/core/init/readme.txt中有详细说明。system/core/rootdir/init.rc15.1.8 Android调试记录:在默认情况下,程序在被init执行时会将标准输出和标准错误都重定向到/dev/null,若想要获得调试信息,可以通过Android中的logwra...

weixin_30576859的博客 127

Unity3D实战:5分钟搞定RTSP监控视频流播放(附完整代码)

本文详细介绍了如何在Unity3D中快速实现低延迟RTSP监控视频流播放,提供完整代码和优化方案。通过Video Player组件和FFmpeg集成,开发者可以轻松应对智能家居和安防监控领域的实时视频流挑战,显著降低延迟并提升性能。

weixin_29015051的博客 586

Android开发艺术探索小记(第十四章)

JavaJNI : java Native Interface(java本地接口) 作用:方便java调用c/c++代码封装的一层接口NDK:Android工具集合 作用:访问C代码;生成动态库(linux:so文件,windows:dll文件) 好处: 1.so库反编译困难,提高安全性(可以放一些appkey,secrect) 2.直接使用现有的c/c++开源库 3.便于平台移植 4

大雄的专栏 616

MATLAB 基于 Baker 映射和 Logistic 混沌序列的图像加解密实现

图像加密是信息安全领域的重要研究方向,在数字版权保护、隐私保护等领域有着广泛应用。本文将介绍基于 MATLAB 的 Baker 映射和 Logistic 混沌序列的图像加解密算法,该算法利用混沌系统的初值敏感性和伪随机性,能够有效地对图像进行加密和解密。基于 Baker 映射和 Logistic 混沌序列的图像加解密算法是一种有效的方法,可以应用于数字版权保护、隐私保护等领域。MATLAB 提供了强大的工具和函数,可以方便地实现该算法。

走向CTO的路上... 933

增益调度控制 —— 理论、案例与交互式 GUI 实现

本文详细介绍了增益调度控制的基本原理、数学模型及公式推导,探讨了该方法在适应非线性系统和大范围工作条件下的优势与局限。通过航空飞行控制、发动机推力控制以及化工过程控制三个典型案例,我们展示了如何利用调度变量动态调整控制增益,从而使得控制系统在各个工作点均能达到优良性能。为帮助工程师和研究者更直观地理解并验证增益调度控制的实际效果,本文提供了一套基于 Python 与 PyQt6 的交互式 GUI 控制系统代码。用户不仅可以实时查看仿真数据,还能通过在线调节参数直观体验调度控制的优势。

闲人编程的博客 1480

Android开发艺术探索》综合技术,JNI和性能优化小结

1. 当crash发生时,系统就会调用UncaughtExceptionHandler的uncaughtException方法,可以读取到异常信息; 实现UncaughtExceptionHandler接口,在uncaughtException(Thread t, Throwable ex),ex.printStackTrace(PrintWriter pw)读取异常信息; public vo

doom20082004的博客 817

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 893

android开发艺术探索 笔记,[读书笔记]《Android开发艺术探索》第十五章笔记

Android性能优化Android不可能无限制的使用内存和CPU资源,过多的使用内存会致使内存溢出,即OOM。android而过多的使用CPU资源,一般是指作大量的耗时任务,会致使手机变的卡顿甚至出现程序没法响应的状况,即ANR。缓存15.1.1布局优化一、怎样进行布局优化?性能优化首先删除布局中没用的控件和层级其次有选择的使用性能较低的ViewGroup。布局优化的还有一种手段是採用标签、标签...

weixin_36102930的博客 266

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android开发艺术探索 笔记,Android 开发艺术探索读书笔记(一)

之前断断续续地学了一些 Android 开发基础,也写过几个简单的 app,但都是特别简单的那种,还有很多知识学完了没有用过,现在已经忘得差不多了。最近找到一本书叫 Android 开发艺术探索(作者叫任玉刚,据说是百度的大牛),2015 年出版的,看完第一章后感觉不错,很适合我这种有点基础的人看,于是决定写个读书笔记,记录自己从书中学习到的知识。第一章本章主要介绍了 Activity 相关的一些...

weixin_42395498的博客 442

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android开发艺术探索读书笔记(一)

首先向各位严重推荐主席这本书《Android开发艺术探索》。     再感谢主席邀请写这篇读书笔记 + 书评。书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书从内容到代码都梳理一遍,一方面方便自己总结,一方面也为主席宣传,如果你还在犹豫要不要入手这本书的时候,希望看完我的笔记,能激发你购买的动力。OK,言归正传,下面先简单写几句书评,本人技术有限,只是从自身

amurocrash的专栏 9618

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《Android开发艺术探索》读书笔记

一、前言 花了几天整理完《Android进阶之光》的读书笔记,效果不是很满意,把以前零散整合成一片超长笔记,总感觉也不是那么好,决定接下来读书笔记还是拆开来,以后也好查找一点。 ...

soleil雪寂 606

Android开发艺术探索读书笔记(一)

思维导图如下:

斩月的专栏 940

Android开发艺术探索笔记

《Android开发艺术探索》这本书在几年前就已经买了,陆陆续续看过几次,都没有看完,没有理解透。 最近重读《Android开发艺术探索》,读了两次,第一次读完感觉还有大量的知识点没有理解,再次阅读,练习书中例子,记读书笔记,理解加深了几分。 [学习笔记]Android开发艺术探索:Activity的生命周期和启动模式 [学习笔记]Android开发艺术探索:IPC机制 [学习笔记]A...

尘埃zza的博客 494

《Android 开发艺术探索》读书笔记完整版

第一章 Activity的生命周期和启动模式 第二章 IPC机制 第三章 View的事件体系 第四章 View的工作原理 第五章 理解RemoteViews 第六章 Android的Drawable 第七章 Android动画深入分析 第八章 理解Window和WindowManager 第九章 四大组件的工作过程 第十章 Android的消息机制 第十一章 Androi...

JiandaoStudio 619

《Android 开发艺术探索》读书笔记

《Android 开发艺术探索》这本书写的太好了,作者任玉刚也是大牛,本人十分佩服,每次阅读这本书,都有不同的理解,所以将书中重要的知识点做了一些笔记,方便以后的阅读,下面是笔记的章节:第一章 Activity的生命周期和启动模式第二章 IPC机制第三章 View的事件体系第四章 View的工作原理第五章 理解RemoteViews第六章 Android的Drawable第七章 Android动画深

K-night的专栏 1527

Android开发艺术探索读书笔记

前言 Android开发艺术(这本书真的是艺术,太崇拜刚哥了,值得每一个做Android开发刷十遍的书)1,Activity生命周期和启动模式典型情况下的生命周期分析onCreate() onStart() onResume() onPause() onStop() onDestroy() onRestart()异常情况下的生命周期分析屏幕旋转onSaveInstanceState() onRes...

杨殿生的博客 428

Android 开发艺术探索 读书笔记

第二章 IPC机制 Android开发艺术探索 p50 IPC 是Inter-Process Communication的缩写,含义:进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。    android中主线程就是UI线程,在UI线程中才能操作界面元素。     android中开启多进程只有一种方法:给四大组件(Activity,Service,Receiver,Cont

Dseai_的博客 646

读书笔记——《Android 开发艺术探索》Binder机制阅读笔记

《Android 开发艺术探索》Binder机制阅读笔记项目代码java代码部分activityService实体类(BOOK)AIDL实体类(Book.aidl)接口类(AidlTestInterface.aidl)binder解析aidl自动生成的类概况 项目代码 java代码部分 activity public class AidlTestActivity extends AppCompat...

蓝冷然的博客 571
上一篇: [读书笔记]《APP研发录》第一章
下一篇: [面经]腾讯一面
陶程
博客等级 码龄12年 360粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值