Android性能优化(第一章)

听说大公司都看重性能优化技巧,那么作为有追求的开发工程师还是要慢慢向高大上靠近的啦
(°∀°)ノ

过早的优化是产生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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值