下面是2015年3月前后项目中遇到的问题:
1.删数据库行无效的问题
现象:
一个包含下载功能的app,包含一个服务。在初始化的时候创建所有需要的线程,同时包括一个数据库读写线程,它会把进行中的下载任务信息每隔一段时间就写入到数据库的行中去。
在业务流程中会删除任务,点击删除会通知数据库更新线程删除行。
删除并退出应用后查看数据库,数据还在。
解决:
跟了全部的数据库操作,删除是OK的,猜测还是哪里把之前删除的下载任务又写入了。
之前同事把数据库线程以及下载模块的初始化代码放在Application类中,因为app包含服务的关系,每次应用启动application对象都会同时被主进程和service调用,所以主进程和service有各自的任务列表和相同的数据库,主进程删除任务时,service任务还在,还在写入,导致之前做了无用功。
2.currentmodificationexception
现象:
同样是同事的代码,下载管理模块,使用了好几个线程,使用synchronized来同步。
UI部分是我。我在下载时会把view传给管理模块,管理模块在需要显示时回调我。
下载管理模块后续经过我手,用了稍久的时间,改成了把异步操作挪到工作线程,状态信息由主线程管理。
运行偶尔出现currentmodificationexception异常,比较难定位。
解决:
多方排查发现没有在其他线程写任务列表。
原来回调前是在一个大的循环中遍历所有任务,被回调后我会检查挂起数目来尝试启动任务,导致列表发生改变。
3.写动画ANR问题
现象:
之前比较SB,有个动画页面,很多动的控件我都定了些变量,会周期性改变,然后重写了onDraw,通过canvas来移动、旋转等,然后起个定时器,多少毫秒post主线程invalidate一次,结果有的机器就会ANR。
解决:
应该是刷新太快导致绘图绘不过来。
当时比较急,因为比较菜,想了个办法,刷新间隔不用timer实现了。先invalidate一次,然后置变量标记当前正在刷新,在ondraw的时候如果判断是我调的刷新,就再postdelay一个invalidate,如此循环。
后来学习了属性动画,问题解决。