Android ListIterator只能读取ConcurrentModificationException

时间:2014-04-16 19:42:54

标签: android concurrentmodification listiterator

即时通讯使用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是真的,当我接下来给我异常..为什么?

0 个答案:

没有答案