即时通讯使用ada框架进行持久化,我在结果上获得itate的listiterator,当我在列表上执行第一个.next()时一切正常,但是当我第二次执行此操作时,会因ConcurrentModificationException而失败,我不知道..
这是我的代码:
public class DoSync {
private Activity activity;
private static volatile DoSync instance = null;
private ProgressDialog dialog;
private ListIterator<Alert> alerts;
private static Alert alert;
private DoSync(Activity syncActivity) {
activity = syncActivity;
if (alerts == null)
initAlerts();
manageAlerts();
}
public static void startSync(Activity activity) {
if (instance == null) {
synchronized (DoSync.class) {
if (instance == null) {
instance = new DoSync(activity);
}
}
}
}
private void initAlerts() {
try {
FirextApplication.getInstance().getDao().alertsWorkSet.fill();
alerts = FirextApplication.getInstance().getDao().alertsWorkSet.listIterator();
} catch (AdaFrameworkException e) {
Toast.makeText(activity, activity.getString(R.string.error_alert_sync), Toast.LENGTH_LONG).show();
if (e.getMessage() != null) {
Log.e(activity.getString(R.string.Firext), e.getMessage());
}
instance = null;
onFinish();
}
}
private void manageAlerts() {
if (alerts.hasNext()) {
alert = alerts.next();
onPreExecute();
sendAlerts();
} else {
onFinish();
}
}
private void sendAlerts() {
PostAlert postAlert = new PostAlert(activity, alert.getTeam(), alert.getPassword(), alert.getClientId(), alert.getWorkString(), String.valueOf(alert.getID()), new ApiResponseListener() {
@Override
public void success(Object value) {
Log.d(activity.getString(R.string.Firext), activity.getString(R.string.alert_sync_ok));
}
@Override
public void error(ApiException e) {
onErrorSync(e);
}
});
postAlert.execute();
}
protected void onPreExecute() {
this.dialog = new ProgressDialog(activity);
this.dialog.setMessage("Enviando avisos");
this.dialog.show();
}
protected void onCrash(ApiException e) {
Log.e(activity.getString(R.string.Firext), activity.getString(R.string.error_alert_sync) + alert.getID());
if (e.getErrorMessage() != null) {
Log.e(activity.getString(R.string.Firext), e.getErrorMessage());
}
Toast.makeText(activity, activity.getString(R.string.error_alert_sync), Toast.LENGTH_LONG).show();
onFinish();
instance = null;
}
protected void onErrorSync(ApiException e) {
onCrash(e);
manageAlerts();
}
protected void onFinish() {
if (this.dialog.isShowing())
this.dialog.dismiss();
ReportListActivity listActivity = (ReportListActivity) activity;
listActivity.initData();
}
}
这是堆栈跟踪(我希望..)
[java.util.AbstractList$SimpleListIterator.next(AbstractList.java:62),com.firext.android.services.api.DoSync.manageAlerts(DoSync.java:67),com.firext.android.services.api.DoSync.onErrorSync(DoSync.java:204),com.firext.android.services.api.DoSync$1.error(DoSync.java:89),com.firext.android.services.api.ApiCallBase.apiError(ApiCallBase.java:35),com.firext.android.services.api.PostAlert$1.onSuccess(PostAlert.java:52),com.loopj.android.http.JsonHttpResponseHandler.onSuccess(JsonHttpResponseHandler.java:73),com.loopj.android.http.JsonHttpResponseHandler.handleSuccessJsonMessage(JsonHttpResponseHandler.java:129),com.loopj.android.http.JsonHttpResponseHandler.handleMessage(JsonHttpResponseHandler.java:120),com.loopj.android.http.AsyncHttpResponseHandler$1.handleMessage(AsyncHttpResponseHandler.java:84),android.os.Handler.dispatchMessage(Handler.java:102),android.os.Looper.loop(Looper.java:136),android.app.ActivityThread.main(ActivityThread.java:5017),java.lang.reflect.Method.invokeNative(Native Method),java.lang.reflect.Method.invoke(Method.java:515),com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779),com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595),dalvik.system.NativeStart.main(Native Method)]
我有2个警报,填充它,并进入迭代器,因为位置0 hasNext是真的,然后返回警报,对于nex,hasnext是真的,当我接下来给我异常..为什么?