Android优化小技巧

本篇文章只是简单的总结下一些android的优化小技巧,欢迎有其他方式的同学联系我补充![email protected]

cell的预载

对于一些列表,我们希望cell中的图片在出现在屏幕中的时候就是已经加载完毕的,或者是其他的需求。我们可以通过以下方式进行设置:

拓展LayoutManager

示例代码:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {
    @Override
    protected int getExtraLayoutSpace(RecyclerView.State state) {
        return screenHeight;
    }
};

此方法用于设置LayoutManager额外的预留空间,可以简单的理解,如果我们返回一个屏幕高度,则对于RecyclerView来说,它将认为整个屏幕的长度是2 * screenHeight, 则onBindViewHolder、onViewAttachedToWindow、onViewDetachedFromWindow的方法执行时机都会被提前,如果我们在onBindViewHolder中加载cell数据资源(如图片)则会在可见屏幕外触发,从而提高用户体验,尤其是对于需要单独请求资源的列表。

ps:值得注意的是:

  1. 该方法导致onBindViewHolder、onViewAttachedToWindow、onViewDetachedFromWindow等一系列方法提前执行,所以这些方法无法成为判定cell进入屏幕的时机。
  2. 额外的空间会增加缓存池中的item个数,导致内存上升,所以权衡使用

预加载资源

利用onViewAttachedToWindow等时机,提前对cell前后的资源进行预加载。

秒开优化

利用图片加载库的任务管理

在打开图片列表时,利用图片加载库的任务管理,让屏幕中的图片以更高优先级加载,保证首屏时间

异步数据请求和view初始化

view初始化较为耗时,我们可以将数据请求和view初始化并发异步执行,当数据请求成功时判断view初始化,完成则填充数据,否则保存到临时数据中,初始化view结束后,判断临时数据是否为空,不为空则填充数据。
Android优化小技巧_第1张图片

延时加载

将页面展现不需要的元素渲染或请求滞后,放在首次请求数据成功之后进行延时加载。

不必要的view只进行占位,需要时再添加渲染

利用ViewStub组件,进行占位,当需要渲染时,再进行该View子树的渲染,渲染后该View会替代原ViewStub的位置,而ViewStub则会被移出view树,请不要尝试二次渲染ViewStub,否则会空指针。

内存优化

控制图片渲染尺寸

一般的图片加载库在使用loadUrl to drawable/bitmap时,由于没有拿到图片应该加载的尺寸,所以会拿到屏幕尺寸,按照屏幕尺寸进行加载,此时如果图片分辨率过高,则会导致该图片对象占用大量视图层内存,导致UI线程卡顿,所以可以利用图片比例或view真实宽高进行加载图片,图片加载库会加载最适合该比例的图像,从而降低内存大小。

通过内存分析,优化代码

通过内存分析,合理优化代码,该const/final的就final掉,对于一些"1"的字符串魔法值,使用String.valueOf(1)来替代,减少无意义内存优化。

帧率优化

请保证开启硬件加速

安卓的硬件加速可以极大的降低静态View的刷新率,对于图片列表,请务必开启硬件加速,否则通过软件加速进行的屏幕刷新有大概率会认为屏幕中的列表需要刷新,从重新绘制整个图像,导致UI线程严重卡顿。

降低View布局层次

安卓布局层次对于view的刷新和view树的管理都影响极大,请务必保证view树没有无用的层级,合理的利用merge标签会极大的提高列表的性能。

降低onScroll时的性能损耗

在列表滑动时,请不要尝试在滑动监听中使用过于耗时的操作,否则会阻碍UI线程。

你可能感兴趣的:(Android,优化,帧率,view)