Reputation: 229
I want start learn RxJava and RxAndroid and I write below codes.
I added 3 numbers into Observable
and I want show this 3 numbers into Toast
with Observer
!
I added this numbers : 1,2,3
I learn Rx with one video and in this video show each of the numbers into Toast
.
But in my code just show last number into Toast
.
My mean is : In tutorial video if he added 3 numbers show each 3 numbers into Toast
, but in my code just show last number!
My codes:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable<Integer> observable = Observable.just(1, 2, 3);
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() {
}
};
}
}
How can I fix it?
Upvotes: 1
Views: 87
Reputation: 5734
You should keep in mind that when showing multiple Toasts, they overlap.
You can see last toast because the toasts are shown immediately and sequentially with the same timing for each other, and they overlapping and you can see last one.
Use some log for testing or put an interval between each emitted item. for adding this use concatMap
function like:
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());
Upvotes: 2