Android-事件体系全面总结+实践分析内容太过真实

本文详细介绍了作者在开发Android自定义EditText控件时遇到的表情输入卡顿问题,通过性能分析工具定位到问题并提出解决方案。文章讨论了从中间删除表情导致的卡顿原因,分析了TextView和SpannableStringBuilder的交互,提出了自定义Editable.Factory和SpannableStringBuilder以优化性能的策略。此外,文章还分享了关于Android开发的学习心得和经验。
摘要由CSDN通过智能技术生成

开头

相信大多数互联网的从业者都有着这样一个梦想:进大厂,获得丰厚的薪酬,和更优秀的人一起共事,在技术上获得更快的成长。

**然而部分人其实一直都陷入了“穷忙”的困局,觉得自己每天白天黑夜都在工作,高强度输出,但是却并没有获得机会的眷顾。**久而久之,既不知道自己忙什么,也不知道怎么能停下来。

这并不是时间的过错,而是因为把解决方式过多押注在技术上,然后继续在工作上不断循环,这样的状态让你极度缺少另一个层面的思考。

如何去打破这种僵局呢?很多人建议多读书,但是从哪种类型的书开始看又该看谁的书呢?说实话,很多技术书写到最后大同小异。但是万变不离其宗,源代码以及参考手册需要多些钻研,扎根底层是程序员应有的素养。

现在互联网讯息如此便捷,学习资料从来不缺。硬盘里都是各种学习资源,上下班坐地铁,还要刷技术视频。但是泛看不如精看、精读。

这里我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。

需要的**小伙伴私信【学习】**我免费分享给你,以后的路也希望我们能一起走下去。

前言

自己在做SpEditTool:一个支持表情,@mention,#话题#等功能的EditText控件,这个项目的时候出现了一个很奇怪的问题

  • EditText输入表情过多的时候,从中间开始删除表情,会出现非常卡的情况,而从最后开始删除则不会

对比微信的表情输入功能之后,发现微信这个浓眉大眼的也有这样的feature(微信都有的现象那能是bug嘛,大雾。。。)

不过自己写的东西有问题心里总归不爽,断断续续折腾一个礼拜终于把这个问题解决了,整个过程中自己感觉受益匪浅,记录下分享给大家

最初的实现

    setOnKeyListener(new OnKeyListener() {
      @Override
      public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
          return onDeleteEvent();
        }
        return false;
      }
    });

  private boolean onDeleteEvent() {
    int selectionStart = getSelectionStart();
    int selectionEnd = getSelectionEnd();
    if (selectionEnd != selectionStart) {
      return false;
    }
    SpData[] spDatas = getSpDatas();
    for (SpData spData : spDatas) {
      if (selectionStart == spData.end) {
        Editable editable = getText();
        editable.delete(spData.start, spData.end);
        return true;
      }

    }
    return false;
  }

SpData中保存了表情对应的文本的开始位置和结束位置,直接使用Editable.delete()删除

问题定位

粗略定位

先打Log粗略定位下问题,把自己觉得可能会造成卡顿的地方都加了log,发现卡顿的罪魁祸首就是editable.delete(spData.start, spData.end);这一行

精确定位

再准备顺藤摸瓜找到卡顿的真正元凶,但是代码跳着跳着就到SpannableStringBuilderTextView这两个超大的类里去了,在哪卡的还不知道自己就绕晕了,只能靠性能检测工具先具体定位到问题再进一步分析了

这里用到了AndroidStudio3.0自带的Android Profiler,具体的用法可以看AndroidStudio3.0 Android Profiler分析器

FlameChart

先通过火焰图看看最耗时的调用栈是哪一条

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值