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 和合本)

0 0
原创粉丝点击