Android自定义表情删除时卡顿问题的定位与优化

a4ecd6a925612ef59ac2babf4d5b5298.jpeg

c216a55c661c8832567e3dcc96831820.gif

本文字数:2001

预计阅读时间:15分钟

01

背景

在我们的实际应用中,用户在发布文本时,输入大量表情后尝试从中间删除时,会出现明显的卡顿问题。这种操作可能耗时长达2s,导致用户体验受到严重影响。通过使用 Profiler 分析耗时的方法,我们找到了造成卡顿的原因,并参考了 emoji2 源码提出了解决方案。

02

原因分析

如图所示,当从中间删除一个表情时,耗时方法从 SpannableStringBuilder.delete执行到 SpannableStringBuilder.sendSpanChanged方法, SpannableStringBuilder.sendSpanChanged方法调用了 DynamicLayout$ChangeWatcher.onSpanChanged,执行了很多次,并且每次调用非常耗时。

a4a09f72c5f0b1a2fd18b1f9c1798d0c.jpeg

点击DynamicLayout$ChangeWatcher.onSpanChanged方法后看一下对这个方法的分析,从下图中可以看出这个方法被调用了很多次。d013c8f11bea20ac1eeb1eda308be9a7.jpeg

根据以上Profiler的分析,我们无法准确定位问题所在,因此我们决定测试系统表情的表现。测试结果显示,系统表情并没有出现卡顿的问题。因此,我们怀疑可能是我们的自定义表情尺寸过大,尝试压缩表情图标,但仍然出现卡顿现象。

通过分析 Profiler 的输出,我们发现有一个类与 emoji2 中的 androidx.emoji2.viewsintegration.EmojiKeyListener.onKeyDown 方法相关。emoji2 是官方推出的用于适配系统表情的库,我们猜测 emoji2 可能对系统表情进行了特殊优化和处理。查看 emoji2 的源码后,确实发现了对表情输入进行了特殊优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值