Android性能优化(第一章)
来源:互联网 发布:java语言设计培训班 编辑:程序博客网 时间:2024/06/04 17:57
听说大公司都看重性能优化技巧,那么作为有追求的开发工程师还是要慢慢向高大上靠近的啦
(°∀°)ノ
过早的优化是产生BUG的开始,发生问题了别来怪我哦
ε=ε=(ノ≧∇≦)ノ
下面的是笔者一点一点的积累
0x00 Toast的优化
是的,你没看错,就是这个Android控件中最常见的组件,相信大家也知道,要显示Toast必须传入一个Context的引用,那么如果在显示Toast的过程中,如果用户立马把Activity或者Fragment关闭掉那么有很大几率会发生内存泄露,因为Toast持有了Context的引用导致界面无法被回收,不了解内存泄露的小伙伴点这里,如果已经抛弃了Toast采用了SnackBar当我没说过(=・ω・=)
Toast在还有一种情况下也需要优化,在手机的设置中心里面用户可以手贱把App的显示通知栏信息的权限强行关闭掉,那么会导致Toast无法正常显示,也不会报错,在最新的API24 中Google好像给出了检测是否关闭权限的优化方案,反正笔者还是23的开发环境啦╮( ̄▽ ̄)╭
NotificationManagerCompat.from(Context context).areNotificationsEnabled()
那么我们怎么最大限度的解决这种奇葩用户的需求呢(╯°口°)╯(┴—┴ 我们只能手动维护一个Toast的队列了,这里借鉴了这位博主的想法,但是考虑到用户可以源源不断的点击Toast触发显示的按钮,导致Toast堆叠了很多导致半天才会消掉,这里就不贴代码了,实现原理围绕WindowManager addView的原理,把Toast.makeText 生成的Toast对象的view 动态addview在 window上,通过一个计时器配合渐变的动画实现伪Toast的效果,始终保持窗口只有一个view,重新给Toast的Textview赋值并刷新消失的计时器。
Toast布局的源码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="?android:attr/toastFrameBackground"> <TextView android:id="@android:id/message" 改这个的内容就好了 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center_horizontal" android:textAppearance="@style/TextAppearance.Toast" android:textColor="@color/bright_foreground_dark" android:shadowColor="#BB000000" android:shadowRadius="2.75" /></LinearLayout>
0x01 布局文件的优化
这里看官应该比较熟悉了。
include
重用布局的layout时用到,配合merge效果不一般,其中要改变标签内的宽高属性时,要同时重写,layout_width和layout_height。
merge:
通常配合include 的装载的layout一起使用
在一个纵向的父布局LinearLayout中我添加了一个include,里面layout了一个布局文件,那个布局文件中要沿用外层的布局属性,那么在根节点我就可以使用merge标签,而不是在按平常方法写一个LinearLayout,这样可以少渲染一层,有兴趣的小伙伴可以通过SDK包下的hierarchyviewer工具查看布局层级。
ViewStub:
懒加载,效率比visibility GONE要高,内部用WeakReference优化,默认是visibility=GONE,在第一次需要显示的时候调用inflate方法,返回view对象,之后就手动设置visibility 可见或不可见了
Space
在某些情况控件之间需要一些设置一些占位符一样的元素,通常做法是放个view,更好的方法是改成v4包下的Space控件,由于内部的draw方法是空实现,所以性能会些许提高一点。
drawover
在手机开发者选项中可以开启调试GPU过度渲染的开关,过度渲染的体现,配合以上再加上尽量避免不必要的重复设置xml的background应该就能比较好的优化了,其中如果是自定义控件,重写了draw方法有时会导致显示不出drawover的图层,而不是完美优化,切记。
0x02 广播的优化
对于四大控件的广播,一般初学者都会使用原生的BroadcastReceiver,对于只要本App就能接受到的广播完全可以通过选择效率更高一点的LocalBroadcastManager,只用于应用内通信,安全性更好,用法和没有太大改变。在注册和取消注册时通过
LocalBroadcastManager.getInstance(context)
得到实例化单例来操作,发送广播的时候也是。
0x03 在合适的时候选用SparseArray
之所以不用SparseArrayCompat,是Bundle貌似不支持传递(=・ω・=)。
比如有些业务需求要记忆一些列表中checkBox的点击痕迹,通常的做法是初始化一个HashMap来记录,而Google专门对<Integer,V>
的情况进行了优化,原理点击这里
Sparse家族:
SparseBooleanArray 相当于优化版的HashMap<Integer,Boolean>
SparseIntArray 相当于优化版的HashMap<Integer,Integer>
SparseLongArray 相当于优化版的HashMap<Integer,Long>
第一章暂时那么多啦,如有错误,敬请指正!
不但如此,就是在患难中也是欢欢喜喜的;因为知道患难生忍耐,忍耐生老练,老练生盼望;盼望不至于羞耻,因为所赐给我们的圣灵将 神的爱浇灌在我们心里。
(圣经 罗马书 5:3-5 和合本)
- Android性能优化(第一章)
- 《Android应用性能优化》试读:第一章:Java代码优化
- 《Android应用性能优化》第一章 Java代码优化
- 【终极奥义·真】android-性能优化-第一章-布局优化
- iOS性能优化翻译稿(第一章)
- Android 内存优化 第一章
- 精通安卓性能优化-第一章(一)
- 精通安卓性能优化-第一章(二)
- 精通安卓性能优化-第一章(三)
- 精通安卓性能优化-第一章(四)
- 精通安卓性能优化-第一章(五)
- 精通安卓性能优化-第一章(六)
- 精通安卓性能优化-第一章(七)
- 精通安卓性能优化-第一章(八)
- 精通安卓性能优化-第一章(九)
- 精通安卓性能优化-第一章(十)- 总结
- Java程序性能优化-第一章 Java性能优化概述
- Android 性能优化(一)
- opencv 彩色图像对比度增强
- sdk开发项目心得
- MySQL
- sp2-0612错误
- Java设计模式六大原则或者说七大原则 整理 (其实文章里有七个。。。。)
- Android性能优化(第一章)
- 通过CDatabase类创建xls文件
- Android简易实战教程--第二十九话《创建图片副本》
- macos 使用串口终端
- ATM代码
- POJ 1085 Triangle War 极大极小+剪枝 -
- EF调用存储过程、函数
- Jpa到Spring data jpa
- Geometry类型自定义类型转换器