本文字数:2001字
预计阅读时间:15分钟
01
背景
在我们的实际应用中,用户在发布文本时,输入大量表情后尝试从中间删除时,会出现明显的卡顿问题。这种操作可能耗时长达2s,导致用户体验受到严重影响。通过使用Profiler
分析耗时的方法,我们找到了造成卡顿的原因,并参考了
emoji2
源码提出了解决方案。
02
原因分析
如图所示,当从中间删除一个表情时,耗时方法从SpannableStringBuilder.delete
执行到
SpannableStringBuilder.sendSpanChanged
方法,
SpannableStringBuilder.sendSpanChanged
方法调用了
DynamicLayout$ChangeWatcher.onSpanChanged
,执行了很多次,并且每次调用非常耗时。
点击DynamicLayout$ChangeWatcher.onSpanChanged
方法后看一下对这个方法的分析,从下图中可以看出这个方法被调用了很多次。
根据以上Profiler
的分析,我们无法准确定位问题所在,因此我们决定测试系统表情的表现。测试结果显示,系统表情并没有出现卡顿的问题。因此,我们怀疑可能是我们的自定义表情尺寸过大,尝试压缩表情图标,但仍然出现卡顿现象。
通过分析 Profiler
的输出,我们发现有一个类与 emoji2
中的 androidx.emoji2.viewsintegration.EmojiKeyListener.onKeyDown
方法相关。emoji2
是官方推出的用于适配系统表情的库,我们猜测 emoji2
可能对系统表情进行了特殊优化和处理。查看 emoji2
的源码后,确实发现了对表情输入进行了特殊优化