为什么在RxJava中的每个Observable方法中都使用subscriptionOn

时间:2018-10-27 11:55:56

标签: android rx-java rx-java2 rx-android

在本例中尝试理解RxJava时我发现了这一点

getUserObservable方法发出一些用户,我需要知道他为什么放 .subscribeOn(Schedulers.io()),而他已经在主要功能上调用它 我提供了两种方法的摘录 我知道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 :(得分:1)

通常这样做有两个原因:

  • 您会在调用该方法的地方看到预订了可观察对象的调度程序(如果是在您不知道的方法中完成的话)。
  • 您可以使用相同的方法并在应用程序不同位置的不同调度程序上订阅它。

但是,如果您确实知道,它将始终是同一调度程序,则也可以将main移到方法本身中。

编辑

我没有看到fun serializer(data: Any) = if (data is List<*>) { if (data is EmptyList) String::class.serializer().list // any class with serializer data.first()::class.serializer().list } else data.serializer() 方法中已经调用了subscribeOn()。调用方法时,在方法中内部调用它没有意义。对我来说,这似乎是个错误。如上所述,通常.subscribeOn()是在方法外部调用的,但是您也可以在内部进行调用。两者都没有意义。