【发布时间】:2014-08-05 21:18:46
【问题描述】:
我知道对此有很多问题,但在我的情况下,我将它放在同步块中,我确信没有人会更改我的数组列表。但如果我使用 for-每个循环.. 为什么?
这是我的代码 sn-p
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 ??
}
}
}
【问题讨论】:
-
看来你走错了路。此代码块不应导致此异常。
-
您的代码中还有哪些地方使用了
mCallbacks?您是否在调用callAuthCallbacks()之前的某个时间点遍历mCallbacks? -
您始终可以创建自己的
ArrayList子类,该子类在列表发生更改以及由谁更改时进行记录,然后将其替换。这始终是一种有趣的调试技术。 -
是的,mCallbacks 在其他一些地方也得到了迭代,但它们太在
sync块内 -
嗯,这很奇怪。似乎不应该发生异常,如果我们都无法重现您的问题,那么帮助您将有些困难......试试
ArrayList子类的东西,看看是否有帮助?
标签: java android iterator synchronized