Почему OnComplete не вызывается в этом коде? (RxAndroid)
Я знаю, что OnComplete Обозревателя вызывается, когда все элементы выбрасываются. В приведенном ниже коде я помещаю данные из курсора в ArrayList в операторе flatMap. Мой курсор имеет 100 записей ( c.getCount() дает 100), а размер моего списка равен 100. OnNext также вызывается 100 раз. Но onComplete не называется. Я заполняю просмотр списка в 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, но это не так.
Любая помощь приветствуется, спасибо
1 ответ
Решение
Оператор FlatMap объединяет ваш основной поток с вашим потоком flatMapped. Ваша наблюдаемая будет завершена, если q и ваша наблюдаемая из вашего массива завершена. Поэтому проверьте, почему д не завершена.