KokoBand
KokoBand

Reputation: 229

How to fix RxAndroid bug in Android

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

Answers (1)

beigirad
beigirad

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

Related Questions