当前位置: 首页 > 知识库问答 >
问题:

为什么在RxJava中的每个可观察方法中都使用subscribeOn

段阳夏
2023-03-14

getUserWalable方法发出一些用户,我需要知道为什么他把. subbeOn(Schedulers.io()),而他已经在main funcion上调用它,我提供了这两种方法的截取,我知道,subbeOn将使进程发生在后台线程上,但当他调用它两次时,这会有什么不同,我不知道,因为我理解只是在getUsersWalable中调用一次就足够了

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个答案

端木存
2023-03-14

这通常有两个原因:

  • 您可以在调用方法的地方看到,可观察对象订阅在哪个调度器上(如果这是在外部不知道的方法中完成的)
  • 您可以使用相同的方法,并在应用程序不同位置的不同调度器上订阅它

但是如果您确定,它总是同一个调度器,那么您也可以将subscribeOn()移动到方法本身中。

编辑

我没有看到,那是。subscribeOn(Schedulers.io())已在方法中调用。调用方法时,在方法内部和外部调用它是没有意义的。对我来说,这似乎是一个错误。如上所述,通常。subscribeOn()在方法外部调用,但也可以在内部调用。两者兼而有之毫无意义。

 类似资料:
  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 我正在尝试开发我的第一个RxJava例子 我有一个带有文本框和三个按钮的主要活动。第一个按钮初始化单独类中的整数。第二个按钮订阅一个可观察量,该可观察量假定正在观察整数。第三个按钮将整数的值减小 1。 这是我的密码 和班级 当我尝试使用 订阅时,它只是给了我 的值(即 6),然后它给了我完成! 然后我尝试使用,认为我需要使用,只是而不是,但后来我得到了一个返回的空的,然后再次完成! 有人能帮助我从

  • 我正在用RxJava在Android中制作计时器。我需要在RxJava中制作一个计时器,以便每秒发出一个可观察的信号。我试过以下方法,但没有成功。有没有想过我做错了什么?

  • 我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot

  • 我在读一篇教程: http://code.tutsplus.com/tutorials/getting-started-with-reactivex-on-android--cms-24387 它特别关注RxAndroid,但它与RxJava中的几乎相同。我不确定我是否完全理解了这个概念。 下面我写了一个方法,然后是一个示例用法。 我的问题是:这是实现我的函数以便我可以在其他线程上异步运行它们的正