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

RxJava-何时使用带创建方法的可观察

侯令雪
2023-03-14

我在读一篇教程:

http://code.tutsplus.com/tutorials/getting-started-with-reactivex-on-android--cms-24387

它特别关注RxAndroid,但它与RxJava中的几乎相同。我不确定我是否完全理解了这个概念。

下面我写了一个方法,然后是一个示例用法。

我的问题是:这是实现我的函数以便我可以在其他线程上异步运行它们的正确方法吗?事实上,它们只会返回一个创建的可观察的运行真实代码,并处理错误和所有这些东西。

或者这是错的,那么我想知道正确的方法。

Observable<String> googleSomething(String text){
    return Observable.create(new Observable(){
        @Override
        public void call(Subscriber<? super String> subscriber) {
             try {
                String data = fetchData(text); // some normal method
                subscriber.onNext(data); // Emit the contents of the URL
                subscriber.onCompleted(); // Nothing more to emit
            } catch(Exception e) {
                subscriber.onError(e); // In case there are network errors
            }
        }
    });
}

googleSomething("hello world").subscribeOn(Schedulers.io()).observeOn(Schedulers.immediate()).subscribe(...)

还有调度程序。immediate()用于在当前线程上执行订阅服务器代码?它说“创建并返回一个调度器,该调度器在当前线程上立即执行工作。”在javadoc中,但我不确定。

共有3个答案

丌官和泰
2023-03-14

但是,您可以通过Observable.create(新的OnSubscribe{})方法创建可观察:

  • 看看defer()操作符,它允许您返回例如observate。just()和Observable。错误(),因此您不需要直接联系订阅者
  • 首选使用SyncOnSubscribe/AsyncOnSubscribe来处理背压

调度程序。immediate()将在已经存在的线程上保持可观察的处理,因此在您的情况下,它将是一个调度程序。io线程

红朝
2023-03-14

您几乎不应该使用create(),尤其是初学者。有更简单的方法来创建可观察对象,并且很难正确实现。

大多数情况下,您可以通过使用延迟()轻松地四处走动。E、 g.在这种情况下,您应该:

Observable<String> googleSomething(String text) {
  return Observable.defer(new Func0<Observable<String>>() {
    @Override
    public Observable<String> call() {
      try {
        return Observable.just(fetchData(text));
      } catch (IOException e) {
        return Observable.error(e);
      }
    }
  });
}

如果您没有使用选中的异常,那么您甚至可以摆脱try-catch。RxJava将自动将任何RuntimeException转发到订阅者的onError()部分。

乐正明辉
2023-03-14

除非您更有经验并且需要自定义运算符或想要桥接基于旧版addListener/Remote veListener的API,否则您不应该从create开始。StackOverflow上有几个问题,它使用了create并且是问题的根源。

我更喜欢fromCallable,它可以让您生成单个值或抛出异常,因此不需要那些冗长的延迟只是源。

Schedulers.immediate()立即在调用者的线程上执行其任务,在您的示例中是io()线程,而不是主线程。目前,不支持将计算移回Java主线程,因为它需要阻塞蹦床,而且通常是个坏主意。

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

  • 我正在尝试创建一个RxJava BlockingObservable,它将每隔X毫秒发出一个变量的值,直到(条件==true)或超时发生。 下面的代码似乎与我想要的很接近,但它总是发出一次,然后退出。奇怪的是,我在中有一个永远不会正确的条件——我希望这个可观察到的持续发出并最终超时,但事实并非如此。 我错过了什么/做错了什么?

  • 我有一个id列表,并且有一个方法,它接受id并返回可观察的 假设我有用户id(1),我需要使用此方法更新他的配置文件

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

  • 错误:java.lang.IllegalArgumentException:无法为apiInterface.postimage方法的rx.Observable创建调用适配器 UPD: 我将接口和其他更改为: 在那之后,我有一个错误(这是不是意味着,我是对的??): 错误:Android.os.NetworkOnMainThreadException UPD3: *E/AndroidRuntime:

  • 我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成