您的位置:首页 > 移动开发 > Android开发

android群英传笔记 安卓性能优化

2017-03-16 09:16 225 查看
布局优化

1.android UI渲染机制:系统通过vsync信号触发对UI的渲染,重绘,其间隔时间为16ms。如果系统每次渲染时间都保持在16ms,UI看起来就会很流畅。如果16ms不能完成绘制,就会出现丢帧现象,从而出现卡顿现象。

2.避免过度绘制overdraw:overdraw会浪费很多cpu,gpu资源。

3.优化布局层级:android系统中,对view测量,布局和绘制时,都是通过对view数的彼岸来进行操作的,如果一个view树的高度太高,就会严重影响车辆,布局,绘制的速度。因此优化布局的第一个方法就是降低view树的高度。尽量减少布局的嵌套。

4.避免嵌套过多无用布局:嵌套布局会让view树变得越来越高。

5.可以通过<include>标签来重用布局:使用方式,定一个xml布局为list_layout要应用这个布局的时候,通过include的layout引用进来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout="@layout/list_layout"
/>
</LinearLayout>


6.通过使用<ViewStub>实现view的延迟加载:使用方式和include一样,写一个布局,通过viewstub的layout引用这个布局。不同的是直接需要在代码里通过findviewbyid获取到这个viewstub的实例后调用setVisbility(View.VISBLE)或者inflate()方法来让这个viewstub显示。inflate方式可以返回的布局引用 View inflateView=view.inflate();.然后通过这个view可以获取到里面对应的空间TextView
tv = ((TextView)inflateView.findViewById(R.id.tv)); ⚠️注意:不管通过什么方式,让viewstub显示了之后,viewstub就不存在了,取而代之的是inflate的layout。所以不能两次调用inflate方法。用viewstub的好处是,它只有在显示时,才会去渲染整个布局,而view.GONE在初始化布局树的时候,就已经添加到布局树上了,所以viewstub更高效。

7.hierarchyviewer工具可以检测冗余布局。

内存优化:

什么是内存:

由于android应用的沙箱机制,每个应用所分配的内存大小是有限度的,内存太低就会出发LMK-Low Memory Killer机制。内存是指手机的RAM它包含以下几个部分。

1.寄存器(Registers):速度最快的存储场所,因为寄存器位于处理器内部,在程序中无法控制。

2.栈(stack):存放基本类型的数据和对象的引用,但对象本身不存放在栈里,而是存放在堆中。

3.堆(heap):堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器GC来管理。

4.静态存储区域(static field):指在固定的位置存放应用程序运行时一直存在的数据,java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态数据变量。

5.常量池(Constant Pool):jvm虚拟机必须为每个被装在的类型维护一个常量池,常量池就是该类型所用到的常量的一个有序集合,包括直接常量(基本类型,string)和对其他类型,字段和方法的符号引用。

⚠️注意:当定义一个变量,java虚拟机就会在栈中为该变量分配内存空间,当改变量作用域结束后,这部分内存空间会马上被用做新空间进行分配。如果使用new的方式创建一个变量,那么就会在堆中为这个对象分配内存空间,即使改对象的作用域结束,这部分内存也不会立即被回收,而是等待系统GC进行回收。堆的大小随着手机的不断发展而不断变大。

获取堆的大小示例

private void initParams() {
ActivityManager activityManager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
int largeMemoryClass = activityManager.getLargeMemoryClass();
}


内存优化实例

bitmap优化

Bitmap是造成内存占用过高,甚至oom的最大威胁,可以从以下几个方面优化。

1.使用适当分辨率和大小的图片:

2.及时回收内存:一旦使用bitmap后一定要即时使用bitmap.recycle()方法释放内存资源。android3.0后bitmap被放到了堆中,内存由GC管理,就不需要回收了。

3.使用图片缓存:通过内存缓存(lrucache)和硬盘缓存(disklrucache)可以更好的使用bitmap。

代码优化

1.对常量使用static修饰符。

2.使用静态方法,静态方法会比普通方法提高15%的访问速度。

3.减少不必要的成员变量,如果一个变量可以定义为局部变量,尽量不要定义为成员变量。

4.减少不必要的对象,使用基础类型会比使用对象更节省资源,同时避免频繁创建短作用域的变量。

5.尽量不要使用枚举,少用迭代器。

6.对Cursor,Receiver,Sensor,File等对象,要非常注意对他们的创建,回收与注册,解注册。

7.避免使用IOC框架,IOC常使用注解。反射来进行实现,虽然现在java对反射的效率已经进行了很好的优化,但大量使用,还是会带来性能下降。

8.使用RenderScript OpenGL来进行复杂的绘图操作。

9.使用surfaceview来替代view进行大量,频繁的绘图操作。

10.尽量使用视图缓存,而不是每次都执行inflate()方法解析视图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息