Android上带有ORMlite的ConcurrentModificationException

Android上带有ORMlite的ConcurrentModificationException,android,sqlite,rx-java,ormlite,concurrentmodification,Android,Sqlite,Rx Java,Ormlite,Concurrentmodification,在使用ORMlite对数据库执行一些更新操作时,我遇到了大量的ConcurrentModificationException。我正在将执行实际更新的代码包装到rx.Observables中,以实现异步更新。看起来像这样: @Override public void setFavoriteTeams(List<Team> teams) { final Iterator<Team> it = teams.iterator(); Observable.creat

在使用ORMlite对数据库执行一些更新操作时,我遇到了大量的
ConcurrentModificationException
。我正在将执行实际更新的代码包装到
rx.Observables
中,以实现异步更新。看起来像这样:

@Override
public void setFavoriteTeams(List<Team> teams) {
    final Iterator<Team> it = teams.iterator();
    Observable.create(new Observable.OnSubscribe<Object>() {
        @Override
        public void call(final Subscriber<? super Object> subscriber) {

            try {
                List<String> teamIds = new ArrayList<>();
                while (it.hasNext()) {
                    Team team = it.next();
                    teamIds.add(team.getmSipId());
                }

                setFavoriteTeamsSql(teamIds);
            } catch (Exception e) {
                handleException(e);
            } finally {
                subscriber.onNext(null);
                subscriber.onCompleted();
            }
        }
    }).subscribeOn(Schedulers.computation()).subscribe();
}
更新2:

...
mNetworkTeamRepository
    .subscribeOn(Schedulers.io())
    .obseveOn(AndroidSchedulers.mainThread())
    .subscribe(new DefaultSubscriber<List<Teams>>() {
        @Override
        public void onSuccess(List<Team> teams) {
            mTeamsCache.setFavoriteTeams(teams);
        }

        public void onResult(List<Team> teams) {
            callback.showTeams(teams);
        }
    });
...
。。。
mNetworkTeamRepository
.subscribeOn(Schedulers.io())
.obsevenon(AndroidSchedulers.mainThread())
.subscribe(新的DefaultSubscriber(){
@凌驾
成功时公开作废(列出团队){
mTeamsCache.setFavoriteTeams(团队);
}
公开结果(列出团队){
回拨.表演队(队);;
}
});
...

TeamRepository在内部使用改装服务来获得服务器端响应。

您的代码相当于

public void setFavoriteTeams(List<Team> teams) {
  Observable
  .fromIterable(teams)
  .map(Team::getmSipId)
  .toList()
  .doOnNext(this::setFavoriteTeamsSql)
  .subscribeOn(Schedulers.computation())
  .subscribe();
}
public void setFavoriteTeams(列出团队){
可观察
.fromIterable(团队)
.map(团队::GetMsipd)
托利斯先生()
.doOnNext(this::setFavoriteTeamsSql)
.subscribeOn(Schedulers.computation())
.subscribe();
}

但我仍然看不到您的代码如何发出
ConcurrentModificationException
-也许堆栈跟踪会有所帮助?

我用堆栈跟踪更新了我的问题。是的,我要尝试的第一件事是将迭代器向下移动到订阅服务器中。同样重要的是,代码的任何其他部分都会修改传入列表吗?因为它在其他方面没有意义。嗯,是的,在服务器端请求响应中,我得到一个团队列表,然后调用此方法将响应保存在数据库中,然后通过回调将集合传递到UI中。请求是从几个屏幕发送的,所以我不确定哪个会失败。但是setFavoriteTeams中的interactior不应该阻止这一点?我将用我的interactior/UseCase实现更新答案,这样你就可以看到我在说什么了。我们可以复制一下:
final Iterator it=new arraraylist(teams)。Iterator()
public void setFavoriteTeams(List<Team> teams) {
  Observable
  .fromIterable(teams)
  .map(Team::getmSipId)
  .toList()
  .doOnNext(this::setFavoriteTeamsSql)
  .subscribeOn(Schedulers.computation())
  .subscribe();
}