Android上带有ORMlite的ConcurrentModificationException
在使用ORMlite对数据库执行一些更新操作时,我遇到了大量的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
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();
}