美文网首页程序员
常见问题和性能优化

常见问题和性能优化

作者: lipyhui | 来源:发表于2018-11-29 07:44 被阅读0次

一、说明

      笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android开发艺术探索》。

      因此需要着重感谢任玉刚先生和他所著的《Android开发艺术探索》;然后感谢任玉刚先生授权我使用小部分《Android开发艺术探索》原文。

      推荐Android开发者购买正版《 Android开发艺术探索》,该书是初级Android开发者进阶的必备良品!

    由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修正。谢谢!

二、笔记时间

    2018年10月12日

三、简述

    本文主要记录《Android开发艺术探索》中第十三章和第十五章中的重要知识点,其中包含crash信息、方法数越界、布局优化等一些重要知识细节。

    文中加入了一些个人理解,可能有一些说明不合理或者错误之处,望各位读者指出错误的地方,以便我来修改错误,避免误导读者。谢谢!

四、详情

1、使用CrashHandler来获取应用的crash信息

     Android 中不可避免地会发生奔溃,当奔溃的时候系统会杀死应用,出现不友好界面。可以通过setDefaultUncaughtExceptionHandler来捕获异常信息,并进行相应处理。

2、方法数越界

     在Android单个dex文件能够包含的最大方法数为65536。当应用的方法数达到65536后,编译就会出现异常。第一种方式是通过multidex来解决方法数越界的问题(开启打包为多dex),即修改工程app目录下的build.gradle,在defaultConfig中添加“multidexEnable = true”这个配置项,然后引入multidex的依赖“compile 'com.android.support.multidex:1.0.2'”。第二种方式是通过动态加载的方法来解决方法数越界的问题,动态加载技术也叫插件化技术,需要处理好其中的资源访问(未安装的插件apk)、Activity的生命周期管理(反射和接口方式等)、插件ClassLoader的管理等。

3、布局优化

     布局优化的规则是尽量减少布局文件的层级。布局优化注意以下几点:

1)删除布局中无用的控件和层级。

2)有选择性的使用性能较低的ViewGroup,比如RelativeLayout。

3)如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就使用LinearLayout。FrameLayout和LinearLayout一样都是简单高效的ViewGroup,我们可以考虑使用他们。

4)当布局层级比较复杂的时候,建议采用RelativeLayout来布局。

5)多采用<include>标签、<merge>标签和ViewStub。

     <include>标签可以将一个布局加载到当前布局中,用来优化布局的复杂性和模块化,当<include>标签使用了android:layout_*属性的时候,那么宽高android:layout_width和android:layout_height必须存在,否则其他android:layout_*属性无法生效;

     <merge>标签一般配合<include>标签,用来优化布局的层级。比如当前布局是垂直方法的LinearLayout,被包含的布局也是垂直方法的LinearLayout,那么被包含的布局中的LinearLayout是多余的,可以用<merge>标签来代替,用以减少布局层级。

     ViewStub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义是按需加载所需的布局文件,适合一些布局文件按条件显示的场景。

4、绘制优化

     绘制优化是指View的onDraw方法要避免执行大量的操作。注意两方面即可:第一,onDraw中不要插入新的布局对象;第二,onDraw中不要做耗时的任务,也不能执行成千上万的循环操作。这都是因为onDraw可能会被频繁调用,另外Android要求每帧的绘制时间不超过16ms(60fps,1000/60),因此这些操作可能会导致显示卡顿等。

5、内存泄露优化

     内存泄露是一个比较重要的问题。内存泄露的优化分两种情况,第一,在开发过程中避免写出有内存泄露的代码;第二,通过工具(MAT)分析找出泄露点来进行优化。

6、性能优化建议

1)避免创建过多的对象。

2)不要过多使用枚举,枚举占有的内存空间比整型大。

3)常量使用 static final来修饰。

4)使用一些Android特有的数据结构,比如SparseArray和Pair等。

5)适当使用软引用和弱引用。

6)采用内存缓存和磁盘缓存。

7)尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露。

相关文章

网友评论

    本文标题:常见问题和性能优化

    本文链接:https://www.haomeiwen.com/subject/ztwwaftx.html