当我正在学习rx java时,我发现了另一个我非常好奇的问题。 我正在尝试使用Retrofit创建更多的list和rx java android扩展。 所以我已经创建了流到我的List并且每当我需要更多数据时调用onNext,这意味着(非常关键)2-3在开始时,我按批次10加载数据,首先我必须加载它们3时间,一个接一个,然后在每个值我应用扫描方法来增加我的价值
.scan(0, new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer + 1;
}
}
然后使用retrofit执行请求,返回字符串列表并更改适配器数据 我当然打电话给
.subscribeOn(Schedulers.newThread().observeOn(AndroidSchedulers.mainThread()
但我得到了一个例外
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes.
似乎适配器数据正在尝试从后台线程进行修改,但是我已经检查过,每当我调用adapter方法来修改我在主线程上的数据时。当我加载单个批处理时,这个问题不会发生,只有当我尝试加载少量而且很好时我无法弄清楚它为什么会发生。下一个副作用是有时第二批是在第一批之前加载的。我一直在搞乱阻止obvservable,但没有任何结果。
感谢您的任何提示。
我逻辑上的伪代码:
CreateListObservable
.scan(increase value by 1)
.flatMap(download batch of values)
.scan(add new batch to existing one)
.subscribe(Schedulers.newThread)
.observeOn(AndroidSchedulers.mainThread)
.subscribe(data -> adapter.changeData(data)
似乎比在更改数据(1s)之间添加一些睡眠时,此错误消失,很奇怪
答案 0 :(得分:1)
您是否尝试在将输出数组传递给适配器之前复制它?如果是扫描保留的数组,则由于扫描,进一步的请求可能正在编辑后台线程上的数组内容。
.subscribe(data -> adapter.changeData(data.copy())