我知道这里有很多问题,但在我的例子中,我把它放在一个同步块中,我相信没有人会改变我的数组列表。但是,如果我使用的是-每个循环,那么有时我还是会得到这个异常。为什么?
这是我的代码片段
final static Object mLock = new Object();
private static ArrayList<ConnectionAndAuthCallback> mCallbacks;
private void callAuthCallbacks() {
synchronized (mLock) {
if (mCallbacks != null)
for (ConnectionAndAuthCallback calback : mCallbacks) { //here i get exception
calback.onAuthentication(mToken, calback.intent);
}
}
}下面是我在回调时所做的代码
@Override
public void onAuthentication(String token, Intent intent) {
web.loadUrl("xyz.com");
//unregister so that we wong get any exception or some more callbacks
SameClass.unRegisterAuthCallbacks(this);
}并且在注销函数中
public static void unRegisterAuthCallbacks(ConnectionAndAuthCallback callback) {
synchronized (mLock) {
if (mCallbacks != null)
if (mCallbacks.contains(callback)) {
mCallbacks.remove(callback); // This causing problem ?? In same thread "syncronised" wont work ??
}
}
}发布于 2014-06-22 15:22:43
答案是,在同一个线程中,synchronised(){}是行不通的。即使你认为它有效,也可能会有一把死锁。
在我的例子中,我在调用回调的同一个线程中从ArrayList中删除回调对象。
发布于 2014-06-16 05:54:09
您不能对ArrayList或remove()执行修改,在这种情况下,您目前正在读取或循环执行。使用迭代器代替。
https://stackoverflow.com/questions/24237082
复制相似问题