【问题标题】:Why is OnComplete not called in this code? (RxAndroid)为什么在这段代码中没有调用 OnComplete? (RxAndroid)
【发布时间】:2015-07-09 11:53:38
【问题描述】:

我知道当所有项目都发出时,会调用 Observer 的 OnComplete。在下面的代码中,我将光标中的数据放入 flatMap 运算符中的 ArrayList 中。 我的光标有 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 之后完成的,但它没有。

任何帮助表示赞赏, 谢谢你

【问题讨论】:

  • 我的猜测是你在android主线程上做IO,因为你在onError中没有做任何事情,你看不到异常。将 observeOn 放在订阅之前。
  • 永远,永远,将onError 留空——在我因为onError 为空而寻找错误的时间里,我写e.printStackTrace() 的次数对于程序员的一生来说已经足够了。 ..

标签: android rx-java rx-android


【解决方案1】:

FlatMap 运算符将您的主流与您的 flatMapped 流合并。如果 q 和您的数组中的 Observable 完成,您的 observable 将完成。 所以检查为什么 q 不完整。

【讨论】:

  • 哦,是的!从来没有打过我!谢谢! :D 问题是我正在使用一个库,并且 q 从库中返回。我想我只需要想办法解决这个问题。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
相关资源
最近更新 更多