Как исправить ошибку RxAndroid в Android - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу начать учиться RxJava и RxAndroid , и я пишу ниже коды.
Я добавил 3 числа в Observable, и я хочу показать это 3 числа в Toast с Observer!
Я добавил эти числа: 1,2,3
Я изучаю Rx с однимвидео и в этом видео показать каждое из чисел в Toast.
Но в моем коде просто показать последний номер в Toast.
Я имею в виду: В обучающем видео, если он добавил 3 числа , покажите каждые 3 числа в Toast, но в моем коде просто покажите последний номер!
Мои коды:

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() {

            }
        };
    }
}

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Следует помнить, что при показе нескольких тостов они перекрываются.

Вы можете увидеть последний тост, потому что тосты показываются сразу и последовательно с одинаковыми временами для друг друга, и они перекрываются, и вы можетесм. последний.

Используйте какой-нибудь журнал для тестирования или установите интервал между каждым испускаемым элементом.для добавления используйте функцию 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());
0 голосов
/ 14 февраля 2019

Вы должны использовать 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());
...