开头
相信大多数互联网的从业者都有着这样一个梦想:进大厂,获得丰厚的薪酬,和更优秀的人一起共事,在技术上获得更快的成长。
**然而部分人其实一直都陷入了“穷忙”的困局,觉得自己每天白天黑夜都在工作,高强度输出,但是却并没有获得机会的眷顾。**久而久之,既不知道自己忙什么,也不知道怎么能停下来。
这并不是时间的过错,而是因为把解决方式过多押注在技术上,然后继续在工作上不断循环,这样的状态让你极度缺少另一个层面的思考。
如何去打破这种僵局呢?很多人建议多读书,但是从哪种类型的书开始看又该看谁的书呢?说实话,很多技术书写到最后大同小异。但是万变不离其宗,源代码以及参考手册需要多些钻研,扎根底层是程序员应有的素养。
现在互联网讯息如此便捷,学习资料从来不缺。硬盘里都是各种学习资源,上下班坐地铁,还要刷技术视频。但是泛看不如精看、精读。
这里我总结了一些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);
这一行
精确定位
再准备顺藤摸瓜找到卡顿的真正元凶,但是代码跳着跳着就到SpannableStringBuilder
和TextView
这两个超大的类里去了,在哪卡的还不知道自己就绕晕了,只能靠性能检测工具先具体定位到问题再进一步分析了
这里用到了AndroidStudio3.0自带的Android Profiler
,具体的用法可以看AndroidStudio3.0 Android Profiler分析器
FlameChart
先通过火焰图看看最耗时的调用栈是哪一条