Rx java android链接请求

时间:2014-10-15 18:18:42

标签: android rx-java

当我正在学习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)

编辑2

似乎比在更改数据(1s)之间添加一些睡眠时,此错误消失,很奇怪

1 个答案:

答案 0 :(得分:1)

您是否尝试在将输出数组传递给适配器之前复制它?如果是扫描保留的数组,则由于扫描,进一步的请求可能正在编辑后台线程上的数组内容。

.subscribe(data -> adapter.changeData(data.copy())