最近开发中的一些坑#1

本文总结了在Android开发中遇到的一些问题,包括下载进度item无法长按、ViewPager无法滑动、UIL图片加载错误、saveLayer性能问题以及不应主动调用on*方法等,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牢骚

最近回学校, 听说阿里好多实习生都被拒了, 不过大概都被捡漏了, UC这方面还没动静, 不知道是打算把我当临时工使还是怎么, 有点烦躁, 还是得加强自己的能力才行.
最近半年一直在做音乐播放器项目, 开发期间遇到了许多奇怪的问题, 有些我单独写了文章, 有些只是临时找到了解决方法, 没有仔细研究, 这里先总结一下.

下载进度item无法长按

下载item

上面是一个比较常见的下载item, 开发中我们发现经常出现不能对其进行长按操作的情况, 表现就是长按后长按被取消.
追踪源码, 最可疑的地方就是requestLayout.
一个控件调用requestLayout, 很可能让他的父控件也调这个, 有可能导致最外围的item把自己的状态清除掉.
在很多情况下都会导致控件调用这个方法, 比如setText, setImage*, 当时发布比较赶, 没有仔细看TextView的源码具体是个什么情况, 但是有一点可以确定, TextView在宽度为match_parent并且singleLinetrue的情况下给他设置文本是不会调用requestLayout的, 这是我当时测试的结果, 我们解决这个问题的方法就是让图中的所有文本都只允许单行, 且宽度match_parent, 至于右下角, 那是将gravity设为right了, 两个TextView在一个FrameLayout里.

ViewPager无法滑动

大家可以试一试, 让ViewPager有两页就行, 其中一页放上一个TextView, 设置singleLinetrue, 并且把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, 加上继承层次上很多类都重写了这个方法, 也在初始化的时候调了这个方法, 由于多态的存在, 这个方法调用链会反复执行好几次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值