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

news/2024/7/3 8:43:45

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. 合理的命名风格,仅在非常关键的代码加入凝视。

http://www.niftyadmin.cn/n/3617373.html

相关文章

HDU5462 Manors【半平面交】

题目描述&#xff1a; HDU5462 Manors nnn个人&#xff0c;每个人mmm个旗子坐标为 xi,j,yi,jx_{i,j},y_{i,j}xi,j​,yi,j​&#xff0c;fi(x,y)∑j1m(x−xi,j)2(y−yi,j)2f_i(x,y)\sum_{j1}^m(x-x_{i,j})^2(y-y_{i,j})^2fi​(x,y)∑j1m​(x−xi,j​)2(y−yi,j​)2 点(x,y)(x,…

HDU 2036 改革春风吹满地[多边形的面积]

改革春风吹满地 时限&#xff1a;1000ms Problem Description“ 改革春风吹满地,不会AC没关系;实在不行回老家&#xff0c;还有一亩三分地。谢谢!&#xff08;乐队奏乐&#xff09;”话说部分学生心态极好&#xff0c;每天就知道游戏&#xff0c;这次考试如此简单的题目&#x…

codeforces 814B An express train to reveries

B. An express train to reveries time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Sengoku still remembers the mysterious “colourful meteoroids” she discovered with Lala-chan when they were littl…

PLSQL_游标详解及游标过程

/************************************** 003 PL/SQL 游标 *****************************************/ /** 游标&#xff1a;三类&#xff1a;1隐性游标(SQL%FOUND.缺省写法存在、可以捕捉到、很少用) 2显式游标 3参照(REF)游标 操作步骤: 声明游标 -> 打开游标 -> …

LOJ#6511. 「雅礼集训 2018 Day8」B【线性规划对偶问题,费用流】

题目描述&#xff1a; 题目分析&#xff1a; 求最大费用可行流即可。路径的长度指路径上的tit_iti​之和。 对偶理论&#xff1a; 变量非负&#xff0c;约束不等式同号&#xff0c;下面这张图截自百度百科对偶理论 LOJ上有不二分的做法&#xff0c;8是太懂。。虽然上面这个做…

React.js 中的组件通信问题

引入 本来我是没想过总结这些东西的&#xff0c;会感觉比较入门。但是之前同学去腾讯面试问到了这个问题(react或vue的组件通信)&#xff0c;我帮他整理&#xff0c;顺便写demo的过程中&#xff0c;会有一些新的体会&#xff0c;多总结还是有利于进步的呀。 另外本次的代码都放…

linux命令行简记

打开终端快捷键 &#xff1a;CtrlAltT\texttt{CtrlAltT}CtrlAltT ls\text{ls}ls &#xff1a;显示当前目录下的文件 pwd\text{pwd}pwd &#xff1a;显示当前目录路径 cd xxx\text{cd xxx}cd xxx &#xff1a;转到 xxx\text{xxx}xxx 目录下 cd ..\text{cd ..}cd .. &#xff1a;…

hdu 4857 逃生 反向拓扑排序

糟糕的事情发生啦&#xff0c;现在大家都忙着逃命。但是逃命的通道很窄&#xff0c;大家只能排成一行。 现在有n个人&#xff0c;从1标号到n。同时有一些奇怪的约束条件&#xff0c;每个都形如&#xff1a;a必须在b之前。 同时&#xff0c;社会是不平等的&#xff0c;这些人…