我想开始学习 RxJava 和 RxAndroid ,并编写以下代码。
我在Observable
中添加了 3个数字,并想用Toast
在Observer
中显示此 3个数字!
我添加了以下数字: 1,2,3
我通过一部视频学习了 Rx ,并在此视频中将每个数字显示在Toast
中。
但是在我的代码中,只需在<{1}中显示最后个数字即可。
我的意思是::在教程视频中,如果他添加了 3个数字,请在Toast
中显示每个3个数字,但在我的代码中仅显示最后一个 >号!
我的代码:
Toast
我该如何解决?
答案 0 :(得分:2)
请记住,当显示多个Toast时,它们会重叠。
您可以看到最后的吐司,因为这些吐司会以彼此相同的时间立即并顺序显示,并且它们重叠并且可以看到最后一个。
使用一些日志进行测试,或者在每个发射的项目之间放置一个间隔。添加此使用concatMap
函数,例如:
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.concatMap(new Function<Integer, ObservableSource<Integer>>() {
@Override
public ObservableSource<Integer> apply(final Integer integer) {
return Observable.interval(2, TimeUnit.SECONDS)
.take(1)
.map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer aLong) {
return integer;
}
});
}
})
.subscribe(observer());
答案 1 :(得分:-1)
您必须使用from()
。
尝试以下代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
Observable<Integer> observable = Observable.fromIterable(list);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer());
}
private Observer<Integer> observer() {
return new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Toast.makeText(MainActivity.this, integer + "", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
}
Observable.from()
与Observable.just()
-Observable.just()
之间的差异仅发出一次,而Observable.from()发出n次,即数组的长度,在这种情况下为3。
编辑 尝试以下代码:
Observable.just(1, 2, 3)
.forEach(o->Toast.makeText(MainActivity.this, o + "", Toast.LENGTH_SHORT).show());