各位大佬们 晚上好 ,
有个问题 求各位大神瞅一眼。
今天遇到一个bug 如下图(动图转换成链接了,只是个概念图 设备不在身边没办法百分百复现)
链接 http://m.qpic.cn/psc?/V10HPnpE4LATa2/ruAMsa53pVQWN7FLK88i5hGe9BiLdnJv6ruNEyq3TEvTBQ0fwViEAvZHo1OUyw6SDCDqtroo17q1MHn*vI7Jrr3TNmEjV6I.OuhmPvrqFcQ!/b&bo=aAHwAAAAAAACJ5o!&rf=viewer_4
我调查之后发现 这个bug的原因是 因为mHandler.postDelayed 被调用时 偶现出现两个线程对progress 进行操作的现象,从而导致控件的值闪烁。
这是我打的log,确实有两个线程一起走到onImportFlie()方法....
不太理解为什么会出现两个线程,线程结束是run执行完后结束吗?
我自己总结了两个方法来应对这种情况,但是我不知道该怎么写代码....
1.在控件使用mHandler.postDelayed时 就防止它出现多个线程的问题 比如 防止频繁点击(防止频繁点击对我这个不太有效)
2.在数据处理的时候 只允许一个线程对数据进行操作 如果此时有第二个线程也想对数据进行操作 就干掉它.... (确实不会写)
总之就是 在“多个线程产生前” 和 “多个线程调用同一对象时” 这两个时间点进行处理,从而解决这种现象。
各位大神们 有什么好的建议吗?
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//通过中间层通知Model层进行文件导入动作
}
}, 500);
//Model层 导入方法
public void onImportFlie() {
Iterator iterator = newfileInfos.iterator();
while (iterator.hasNext()) {
try {
@Override
public void onProgress ( long transferSize){
//todo 通知进度
transferSize += finalSize;
mProgressInfo.setFilePath(fileInfo.filePath);
int progress = (int) (transferSize * 100 / mProgressInfo.getTotalSize());
mProgressInfo.setProgress(progress);
}
}
}
}
PS:代码我随便粘贴了两句 大家懂我意思就行 太长了没必要都贴出来...
用线程池管理一下,然后加个锁
从你现有的代码里看不出啥,而且你的代码跟你的日志也对不上。