Android App界面和流畅度优化

版权声明:本文为博主原创文章,转载请以超链接形式标明文章原始出处和作者 https://blog.csdn.net/dongfeng9ge/article/details/53349662

所谓界面和流畅度优化,就是尽可能多地消除用户可直接感知的、影响用户操作体验的bug

1、人为在UI线程中做轻微耗时操作,导致UI线程卡顿

人为避免一切耗时操作

开启 StrictMode(严苛模式)

在Activity里加入如下代码

public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }
注意:StrictMode只适用于测试版本,千万不要在上线版本使用 StrictMode

2、布局Layout过于复杂,无法在16ms内完成渲染
利用drawableXXX属性来做有图文的控件,特别是类似设置页面中文字在左右边有剪头的View
多用tools的属性例如tools:text tools:listitem

3、同一时间动画执行的次数过多,导致CPU或GPU负载过重
人为避免同一时间执行过多动画

4、View过度绘制,导致某些像素在同一帧时间内被绘制多次
简化布局嵌套
减少不必要的背景颜色填充(用纯色图片代替颜色)

在设置-> 开发者选项->调试GPU过度绘制中打开调试
定位绘制区域
利用Android提供的工具进行位置确认以及修改(HierarchyView,Tracer for OpenGL ES)
定位到具体的视图(xml文件或者View)
通过代码和xml文件分析过度绘制原因
结合具体情况进行优化

5、View频繁触发onMeasure,onLayout,导致onMeasure,onLayout累计耗时过多及整个View频繁的重新渲染
使用系统性能分析工具systrace分析measure, layout耗时

6、内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作
使用内存分配跟踪工具Allocation Tracker工具跟踪对象的分配

7、冗余资源及逻辑等导致加载和执行缓慢
lint检查删除冗余
去除重复库无用库,使用更小库
去除无用的语言资源
图片压缩webp
开启ProGuard
开启shrinkResources
buildTypes{
	release{
		miniyEnabled true
		shrinkResources true
		proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	}
} 

8、代码效率低
考虑使用ArrayMap代替传统数据结构HashMap
避免使用enums,推荐使用static

避免在非Constants类中使用static

其他详见《大话Java性能优化》

9、其他
对于不需要使用硬件加速的activity(没有动画效果、视频播放以及各种多媒体文件),不要在AndroidManifest.xml文件声明activity时添加“android:hardwareAccelerated="true"”关掉硬件加速可节省应用内存

对于需要横竖屏转换的应用,又不想在横竖屏切换的时候重新跑onCreate方法,可以在AndroidManifest.xml文件声明Activity时添加“android:configChanges="screenSize|orientation"”

为了减轻应用程序主进程的内存压力,对于耗内存比较多的界面(多媒体),可以在AndroidManifest.xml文件声明Activity时下添加“android:process=".processname"”单开一个进程,退出在退出这个界面的时候一定要在该界面的onDestory方法中调用System的kill方法来杀掉该进程;

可以通过为application、activity自定义主题的方式来关掉多点触摸功能,只需要在自定义的主题下添加这两个标签:
  <item name="android:windowEnableSplitTouch">false</item>
  <item name="android:splitMotionEvents">false</item>


阅读更多
换一批

没有更多推荐了,返回首页