安卓界面优化

1.优化界面层次

针对可以合并的界面层次进行合并,减少界面的渲染,这个过程中主要使用的工具是开发者设置显示过度渲染,红色的区域的必须要优化的地方。

2.减少界面刷新次数

减少界面刷新次数是很好的界面优化,尤其是针对ListView之类的集合型页面。

【1】使用延时减少界面刷新次数:我们做了一个延时机制,每次刷新延迟1s进行,当在这一秒钟又有刷新请求的时候就继续推迟刷新时间,最多达到5s的时候就必须进行界面刷新,这一效果是非常明显的。

【2】刷新界面之前判断是否真的需要刷新:针对其他的固定界面,我们会进行判断是否需要进行界面刷新,如果当前显示与要显示的是一样的,那就没有必要进行刷新。

【3】缓存界面:如果我们要时刻更新ListView中的界面,而这些更新也不会导致ListView的顺序,那就把这些View都做个缓存,直接进行View的更新。

【4】静态化界面:这是缓存界面的一种方式,针对复杂的界面使用static变量缓存,每次构建界面的时候,针对这个static view做调整。

3.界面模型与数据模型分离

原来的时候我们在View显示之前,会针对数据模型进行处理,处理之后才会在界面上显示,这些处理逻辑应该提取出来放在异步线程中,生成具体的界面模型,显示的时候直接拿来展示。

4.把io操作从主线程中剥离出来

这个是3的一个具体体现,把操作文件,数据库等io操作从主线程中剥离出来,避免主线程阻塞。

5.避免资源竞争。

尽量减少一些资源的产生,例如程序中new的操作尽量减少,线程数量合理控制。当内存资源消耗严重时,垃圾回收会被频繁调起,在日志中经常会出现skip frame的情况。

优化将从以下几个方面谈及

1. 如何使用 Adapter

2. 背景和图像

3. 更新请求

4. 视图和布局

5. 内存分配

adapter:

    最简单的方法, 最慢最不实用,    更新频率每秒传输帧数10左右

    利用 convertView 回收视图, 效率提高 200%,更新频率每秒传输帧数30左右

    使用 ViewHolder 模式, 效率提高 250%,更新频率每秒传输帧数40左右

背景和图像:

    选择恰当的图像尺寸,视图背景图像总会填充整个视图区域:

            * 图像尺寸不合适会导致自动缩放

            * 避免实时缩放

            * 最好预先缩放到视图大小

            originalImage = Bitmap.createScaledBitmap(

                    originalImage, // 被缩放图像 

                    view.getWidth(), // 视图宽度

                    view.getHeight(), // 视图高度

                    true); // 双线性过滤器

            背景和图像 更新频率,预先缩放每秒传输帧数在50左右 ,自动缩放25左右   

    窗口背景:

            * 默认情况下, 窗口有一个不透明的背景

            * 有时可以不需要。 

                    - 最高层的视图是不透明的

                    - 最高层的视图覆盖整个窗口 fill_parent

            * 更新看不见的背景是浪费时间

            * 删除窗口背景

                    - getWindow().setBackgroundDrawable(null);

                    - <item name="android:windowBackground">@null</item>

             窗口背景 更新频率,有背景的每秒传输帧数在42左右 ,没有背景在50左右  

    更新请求:

            * 当屏幕需要更新时, 调用 invalidate()

                    - 简单方便

                    - 但会更新整个视图, 太贵了

            * 最好先找到无效区域, 然后调用。更有效的执行方法是只更新需要更新的区域

                    - invalidate(Rect dirty);

                    - invalidate(int left, int top, int right, int  bottom);

            窗口背景 更新频率:invalidate传输每秒18左右,后两个在48左右

    视图和布局:

            * 如果一个窗口包含很多视图

                    - 启动时间长  测量时间长   布局时间长  绘制时间长

            * 如果视图树深度太深

                    - StackOverflowException  用户界面反应速度很慢

            * 解决方法

                    - 使用 TextView 的复合 drawables 减少层次

                    - 使用 ViewStub 延迟展开视图

                    - 使用 <merge> 合并中间视图

                    - 使用 RelativeLayout 减少层次

                    - 使用自定义视图、使用自定义布局

   内存分配:

            * 不要创建 Java 对象,在性能敏感的代码里, 尽量避免创建 Java 对象

                    - 测量: onMeasure()    

                    - 布局: onLayout()

                    - 绘图: dispatchDraw(), onDraw()

                    - 事件处理: dispatchTouchEvent(), onTouchEvent()

                    - Adapter: getView(), bindView()

            * GC, 垃圾回收:整个程序会暂停,慢 (大约几百个毫秒

            * 管理好对象

                    * 使用软引用,内存缓存的最佳选择

                    * 使用弱引用,避免内存泄露

    总结:

        *  用 ViewHolder 实现 Adapter 的 getView

        *  为背景选择正好的图像

        *  针对无效区做更新请求

        *  视图和布局,越简单越好

        *  避免在性能敏感路径上创建对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春哥一号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值