为什么在这段代码中没有调用 OnComplete?(RxAndroid) [英] Why is OnComplete not called in this code? (RxAndroid)
问题描述
我知道在发出所有项目时会调用观察者的 OnComplete.在下面的代码中,我将数据从游标放入 flatMap 运算符中的 ArrayList.我的光标有 100 个条目( c.getCount() 给出 100 )并且我的列表的大小是 100. onNext 也被调用了 100 次.但是没有调用 onComplete.我正在 onComplete 中填充一个列表视图.
I know OnComplete of a Observer is called when all the items are emitted. In the below code, I am putting data from a cursor to an ArrayList in a flatMap operator. My cursor has 100 entries ( c.getCount() gives 100 ) and the size of my list is 100. The onNext is called 100 times too. But the onComplete is not called. I am populating a listview in onComplete.
static int i = 0;
final List<String> ar = new ArrayList<>();
ListView lv = ...;
ArrayAdapter<String> adapter = ...;
.
.
.
q.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<SqlBrite.Query, Observable<String>>() {
@Override
public Observable<String> call(SqlBrite.Query query) {
Cursor c = query.run();
c.moveToFirst();
Log.d("testApp", String.valueOf(c.getCount())); // prints 100
do {
ar.add(c.getString(0));
} while (c.moveToNext());
Log.d("testApp", String.valueOf(ar.size())); // prints 100
return Observable.from(ar);
}
}).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
Log.d("testApp", "onComplete called");
lv.setAdapter(adapter);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d("testApp", "onNext called " + String .valueOf(++i) + " with " + s); // printed 100 times
adapter.add(s);
}
});
新的 Observable 流是在 100 之后完成的,但它没有.
The new stream of Observable is to complete after 100 but it does not.
感谢任何帮助,谢谢
推荐答案
FlatMap 运算符将您的主流与您的 flatMapped 流合并.如果 q 和数组中的 Observable 完成,则您的 observable 将完成.所以检查为什么 q 不完整.
FlatMap operator merge your main stream with your flatMapped stream. Your observable will complete if q and your Observable from your array complete. So check why q doesn't no complete.
这篇关于为什么在这段代码中没有调用 OnComplete?(RxAndroid)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!