Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

本文介绍了Android界面卡顿问题的排查与解决,重点在于主线程执行耗时操作导致的卡顿。通过Android Device Monitor定位耗时方法,将高斯模糊处理放入RxJava的子线程,避免影响主线程。同时,分析了高斯模糊算法的原理,并讨论了Glide的源码,利用LruCache优化内存使用,减少界面刷新时的卡顿现象。
摘要由CSDN通过智能技术生成

原标题:Android性能优化实战之界面卡顿

作者:红橙Darren

https://www.jianshu.com/p/18bb507d6e62

今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿的问题,问我能不能帮忙解决下。由于性能优化涉及的知识点比较多,我一时半会也无法彻底回答。恰好之前在做需求时也遇到了一个卡顿的问题,因此今晚写下这篇卡顿优化的文章,希望对大家有所帮助。

1. 查找卡顿原因

从上面的现象来看,应该是主线程执行了耗时操作引起了卡顿,因为正常滑动是没问题的,只有在刷新数据的时候才会出现卡顿。至于什么情况下会引起卡顿,之前在自定义 View 部分已有详细讲过,这里就不在啰嗦。我们猜想可能是耗时引起的卡顿,但也不能 100% 确定,况且我们也并不知道是哪个方法引起的,因此我们只能借助一些常用工具来分析分析,我们打开 Android Device Monitor 。

40a493e1d3c9aa6a682ef9681e359198.png

图:打开 Android Device Monitor

04c66d44786f03096869b7310c41b52d.png

图:查找耗时方法

2. RxJava 线程切换

我们找到了是高斯模糊处理耗时导致了界面卡顿,那现在我们把高斯模糊算法处理放入子线程中去,处理完后再次切换到主线程,这里采用 RxJava 来实现。

Observable.just(resource.getBitmap())

.map(bitmap -> {

// 高斯模糊

Bitmap blurBitmap = ImageUtil.doBlur(resource.getBitmap(), 100, false);

blurBitmapCache.put(path, blurBitmap);

returnblurBitmap;

}).subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(blurBitmap -> {

if(blurBitmap != null) {

recommendBgIv.setImageBitmap(blurBitmap);

}

});

关于响应式编程思想和 RxJava 的实现原理大家可以参考以下几篇文章:

第三方开源库 RxJava - 基本使用和源码分析

https://www.jianshu.com/p/3e8fa8db6db1

第三方开源库 RxJava - 自己动手写事件变换

https://www.jianshu.com/p/b3b0170152ff

第三方开源库 RxJava - Android实用开发场景

https://www.jianshu.com/p/2bb332f39f7d

3. 高斯模糊算法分析

把耗时操作放到子线程中去处理,的确解决了界面卡顿问题。但这其实是治标不治本,我们发现图片加载处理异常缓慢,内存久高不下有时可能会导致内存溢出。接下来我们来分析一下高斯模糊的算法实现:

9eea7eb18b7156c9f11953b868d6943f.png

看上面这几张图,我们通过怎样的操作才能把第一张图处理成下面这两张图?其实就是模糊化,怎么才能做到模糊化?我们来看下高斯模糊算法的处理过程。再上两张图:

201176da6d43258789b5ca258d713167.png

05b738b866ac724059272d76ab9c8b17.png

所谓"模糊",可以理解成每一个像素都取周边像素的平均值。上图中,2是中间点,周边点都是1。"中间点"取"周围点"的平均值,就会变成1。在数值上,这是一种"平滑化"。在图形上,就相当于产生"模糊"效果,"中间点"失去细节。

为了得到不同的模糊效果,高斯模糊引入了权重的概念。上面分别是原图、模糊半径3像素、模糊半径10像素的效果。模糊半径越大,图像就越模糊。从数值角度看,就是数值越平滑。接下来的问题就是,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。对于这种处理思想,很显然正太分布函数刚好满足我们的需求。但图片是二维的,因此我们需要根据一维的正太分布函数,推导出二维的正太分布函数:

8211ac52bd1a8c9bd73e77e3c6d930ea.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值