1

すべてのアイテムが発行されると、オブザーバーの 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 後に完了する予定ですが、完了していません。

どんな助けでも大歓迎です、ありがとう

4

1 に答える 1

5

FlatMap オペレーターは、メイン ストリームを flatMapped ストリームとマージします。q と配列の Observable が完了すると、observable が完了します。q が完全でない理由を確認してください。

于 2015-07-09T18:45:54.797 に答える