【发布时间】:2016-06-11 00:00:31
【问题描述】:
获得了主线程和 myThread 的代码。当在主线程中按下某个按钮时,myThread.start() 被调用。 onCameraFrame 不断获取帧的颜色值并将其保存到ArrayList<Double> rV。在 myThread 我需要sout(rV),用它做一些事情并每 6 秒清理一次 rV。
我使用迭代器来做这样的事情,但我仍然在 myThread 中的 sout 行得到 java.util.ConcurrentModificationException。请注意,它发生在随机时间。例如,按下按钮后,sout 可能会正常工作 1 秒或 5 分钟,然后 - 异常。
我的建议是 myThread 和主线程 (onCameraFrame) 一次使用 rV。所以它崩溃了。
需要建议。挣扎了好几个小时。
这是代码。
public class Camera extends Activity implements CvCameraViewListener2 {
@Override
public void onCreate(Bundle savedInstanceState) {
..
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
..
myThread = new Thread(mRunnable);
myThread.start();
}
..
}
Runnable mRunnable = new Runnable() {
@Override
public void run() {
Thread thisThread = Thread.currentThread();
while (myThread==thisThread) {
try {thisThread.sleep(6000);}
catch ..}
mButton.post(new Runnable() {
@Override
public void run() {
/*logging*/
if (!rV.isEmpty()){
System.out.println("rV"+"("+rV.size()+")={"+rV.toString()+"}");
}
*//*clean data*//*
for (Iterator<Double> it = rV.iterator(); it.hasNext();) {
while(it.hasNext()){
Double t = it.next();
it.remove();
}
}
}
});
}
}
};
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
..
if (condition) {
rV.add(somevalue);
}
return inputFrame.rgba();
}
【问题讨论】:
-
你试过使用队列(出队)吗?您可以从填充器线程中推送所有新数据并从另一端弹出数据吗?如果需要,读取数据线程可以弹出数据,对其执行某些操作,然后将其填充到另一个集合中。
标签: java android multithreading android-studio iterator