Зачем использовать подписку в каждом методе Observable в RxJava - PullRequest
0 голосов
/ 27 октября 2018

Я обнаружил это, пытаясь понять RxJava в этом примере

Метод getUserObservable, который выдает некоторым пользователям, мне нужно знать, почему он добавил .subscribeOn (Schedulers.io ()), когда он уже вызывал его в основной функции.я предоставил snipt для обоих методов, я знаю, что subscribeOn сделает процесс происходящим в фоновом потоке, но когда он вызвал его два раза, это изменится, я не знаю, так как я понимаю, что просто вызвать его один раз в getUsersObservable будетдостаточно

private Observable<User> getUsersObservable() {
    String[] maleUsers = new String[]{"Mark", "John", "Trump", "Obama"};

    final List<User> users = new ArrayList<>();

    for (String name : maleUsers) {
        User user = new User();
        user.setName(name);
        user.setGender("male");

        users.add(user);
    }

    return Observable
            .create(new ObservableOnSubscribe<User>() {
                @Override
                public void subscribe(ObservableEmitter<User> emitter) throws Exception {
                    for (User user : users) {
                        if (!emitter.isDisposed()) {
                            emitter.onNext(user);
                        }
                    }

                    if (!emitter.isDisposed()) {
                        emitter.onComplete();
                    }
                }
            }).subscribeOn(Schedulers.io());
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_operator);

    getUsersObservable()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map(new Function<User, User>() {
                @Override
                public User apply(User user) throws Exception {
                    // modifying user object by adding email address
                    // turning user name to uppercase
                    user.setEmail(String.format("%s@rxjava.wtf", user.getName()));
                    user.setName(user.getName().toUpperCase());
                    return user;
                }
            })
            .subscribe(new Observer<User>() {
                @Override
                public void onSubscribe(Disposable d) {
                    disposable = d;
                }

                @Override
                public void onNext(User user) {
                    Log.e(TAG, "onNext: " + user.getName() + ", " + user.getGender() + ", " + user.getAddress().getAddress());
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: " + e.getMessage());
                }

                @Override
                public void onComplete() {
                    Log.e(TAG, "All users emitted!");
                }
            });
}

1 Ответ

0 голосов
/ 27 октября 2018

Обычно это делается по 2 причинам:

  • В том месте, где вызывается метод, вы видите, на какой планировщик подписан наблюдаемый объект (если это делается в методе, которого вы не знаете извне).
  • У вас есть возможность использовать один и тот же метод и подписаться на него на разных планировщиках в разных местах вашего приложения.

Но если вы точно знаете, это всегда будет один и тот же планировщик, вы также можете переместить subscribeOn() в сам метод.

EDIT

Я не видел, чтобы .subscribeOn(Schedulers.io()) уже вызывался внутри метода getUsersObservable(). Не имеет смысла вызывать его внутри метода и снаружи при вызове метода. Это похоже на ошибку для меня. Как описано выше, обычно метод .subscribeOn () вызывается вне метода, но вы также можете сделать это внутри. Делать и то, и другое не имеет смысла.

...