RxJava flatMap 运算符的模糊行为
Ambiguous Behaviour of RxJava flatMap Operator
public class MainActivity1 extends AppCompatActivity {
private String LOG_TAG = "MY_LOG";
private CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
compositeDisposable.add(getObservable().subscribeWith(getObserver()));
}
private Observable<Integer> getObservable(){
return Observable.just(1,2,3).flatMap(lValue -> Observable.just(lValue,lValue,lValue));
}
private DisposableObserver<Integer> getObserver(){
return new DisposableObserver<Integer>() {
@Override
public void onNext(@NonNull Integer s) {
Log.d(LOG_TAG,"onNext : " + s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(LOG_TAG,"onError");
}
@Override
public void onComplete() {
Log.d(LOG_TAG,"onComplete");
}
};
}
}
以上代码的输出是:
D/MY_LOG: onNext : 1
D/MY_LOG: onNext : 1
D/MY_LOG: onNext : 2
D/MY_LOG: onNext : 2
D/MY_LOG: onNext : 3
D/MY_LOG: onNext : 3
D/MY_LOG: onComplete
这里1、2、3每次打印两次。预期的行为应该是 1、2 和 3 每次打印三次,因为三个值已在 just
运算符内部传递到 flatMap
运算符中。有谁知道为什么会出现这种奇怪的行为?
代码似乎没问题。有时日志也可能存在问题,如果您经常打印,日志可能不会打印所有值。
尝试添加一个 doOnNext
并查看 just
是否发出所有值
Observable.just(lValue,lValue,lValue).doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Throwable {
Log.d(TAG, "accept: "+ integer);
// or use debugger to check the value
}
})
public class MainActivity1 extends AppCompatActivity {
private String LOG_TAG = "MY_LOG";
private CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
compositeDisposable.add(getObservable().subscribeWith(getObserver()));
}
private Observable<Integer> getObservable(){
return Observable.just(1,2,3).flatMap(lValue -> Observable.just(lValue,lValue,lValue));
}
private DisposableObserver<Integer> getObserver(){
return new DisposableObserver<Integer>() {
@Override
public void onNext(@NonNull Integer s) {
Log.d(LOG_TAG,"onNext : " + s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(LOG_TAG,"onError");
}
@Override
public void onComplete() {
Log.d(LOG_TAG,"onComplete");
}
};
}
}
以上代码的输出是:
D/MY_LOG: onNext : 1
D/MY_LOG: onNext : 1
D/MY_LOG: onNext : 2
D/MY_LOG: onNext : 2
D/MY_LOG: onNext : 3
D/MY_LOG: onNext : 3
D/MY_LOG: onComplete
这里1、2、3每次打印两次。预期的行为应该是 1、2 和 3 每次打印三次,因为三个值已在 just
运算符内部传递到 flatMap
运算符中。有谁知道为什么会出现这种奇怪的行为?
代码似乎没问题。有时日志也可能存在问题,如果您经常打印,日志可能不会打印所有值。
尝试添加一个 doOnNext
并查看 just
是否发出所有值
Observable.just(lValue,lValue,lValue).doOnNext(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Throwable {
Log.d(TAG, "accept: "+ integer);
// or use debugger to check the value
}
})