牢骚
最近回学校, 听说阿里好多实习生都被拒了, 不过大概都被捡漏了, UC这方面还没动静, 不知道是打算把我当临时工使还是怎么, 有点烦躁, 还是得加强自己的能力才行.
最近半年一直在做音乐播放器项目, 开发期间遇到了许多奇怪的问题, 有些我单独写了文章, 有些只是临时找到了解决方法, 没有仔细研究, 这里先总结一下.
坑
下载进度item无法长按
上面是一个比较常见的下载item, 开发中我们发现经常出现不能对其进行长按操作的情况, 表现就是长按后长按被取消.
追踪源码, 最可疑的地方就是requestLayout
.
一个控件调用requestLayout
, 很可能让他的父控件也调这个, 有可能导致最外围的item把自己的状态清除掉.
在很多情况下都会导致控件调用这个方法, 比如setText
, setImage*
, 当时发布比较赶, 没有仔细看TextView
的源码具体是个什么情况, 但是有一点可以确定, TextView
在宽度为match_parent
并且singleLine
为true
的情况下给他设置文本是不会调用requestLayout
的, 这是我当时测试的结果, 我们解决这个问题的方法就是让图中的所有文本都只允许单行, 且宽度match_parent
, 至于右下角, 那是将gravity
设为right
了, 两个TextView
在一个FrameLayout
里.
ViewPager无法滑动
大家可以试一试, 让ViewPager有两页就行, 其中一页放上一个TextView
, 设置singleLine
为true
, 并且把ellipsize
设置成marquee
, 然后把文本内容设置成一个非常长的字符串, 然后手指在这个TextView
上滑动, 你会发现ViewPager根本不动.
追查代码, 其实是TextView
自身有毛病.
大家知道ViewPager
支持嵌套, 而他们之所以能嵌套是因为ViewPager
在准备拦截事件滑动之前, 会先通过ViewCompat.canScrollHorizontally
询问当前页面里面有没有能在当前滑动方向上能滑动的控件, 当然这里有碰撞检测, 只有手指能碰到的View
才会被询问, 而TextView
竟然在上面条件满足时在一定情况下返回true
, ViewPager
认为内层View
可以优先滑动, 就不拦截事件了. 其实这个东西应该是给EditText
使用的, 不知道TextView
凑什么热闹, 印象里面TextView
根本没有接受滑动手势这么一个功能.
在三星手机上不会出这个问题, 因为三星对marquee
的处理统一是end
, 这是三星的bug. 解决方案最简单的就是ellipsize
不要用marquee
, 用end
.
刚才又发现下面这个有可能会出现同样的问题, 把gravity
删掉就好
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:gravity="center"
android:ellipsize="end"/>
UIL图片错乱
如果你用UIL加载res/drawable
目录下的图片, 恰好又把cacheOnDisk
设为true
了, 那么下个版本很可能出现图片错乱的问题, 根源在于UIL通过R.drawable.id
将图片缓存在了磁盘上, 而这个id很可能对应的不是同一张图片, 关于这个我单独写了一篇文章, 详情请移步为什么不推荐用UniversalImageLoader加载res/drawable
saveLayer性能问题
最近有个图标渐变色需求, 不仅要求图标能随意更换颜色, 还要能染渐变色, 我重写了了ImageView.onDraw
来实现, 用了一个叫saveLayer
的东西, 现在看来好像有优化的余地, 但针对这个问题, saveLayer
好像很吃性能, 搞的界面非常卡, 所以如果你的View
用了saveLayer
, 务必在初始化的时候把硬件加速打开, 对应的方法是View.setLayerType
不要主动调用on*方法
这个真的是开发的准则了, 凡是on***的方法, 都不应该主动调用, 比如activity不应该主动调用自己的回调函数.
我们最近一期做了一个换肤功能, 有个onThemeChanged
方法, 会把当前主题传进来, 是外部回调的, 我们偷懒, 在初始化的时候也用这个方法初始化, 结果因为这个方法要调super.onThemeChanged
, 加上继承层次上很多类都重写了这个方法, 也在初始化的时候调了这个方法, 由于多态的存在, 这个方法调用链会反复执行好几次.