【问题标题】:How to return value in rxJava如何在 rxJava 中返回值
【发布时间】:2016-10-21 20:37:36
【问题描述】:

我是 rxJava 的新手,它让我头晕目眩。基本上,我通过改造从 youtube api 中提取数据,该改造返回 Observable,使用 youtubeDataMapper,我将其映射到包含字符串 videoID 的 Youtube Pojo 对象中。所以我的问题是,如何让这个方法返回那个字符串而不是 Completable?

这是我的方法:

@Override
  public Completable downloadVideoUrl(String query) {

    addSubscription(youtubeApi.getYoutubeId(query, Constants.youtubeApi)
                              .map(youtubeDataMapper::map)
                              .subscribeOn(subscribeScheduler)
                              .observeOn(observeScheduler)
                              .subscribe());
    return Completable.complete();
}

【问题讨论】:

    标签: android rx-java


    【解决方案1】:

    你有两个选择:

    1. 让你的downloadVideoUrl返回Observable而不是Completable

      首选方式:

      @Override
      public Completable downloadVideoUrl(String query) {
          return youtubeApi.getYoutubeId(query, Constants.youtubeApi)
                  .map(youtubeDataMapper::map)
                  .subscribeOn(subscribeScheduler)
                  .observeOn(observeScheduler);
      }
      

      请注意这里缺少subscribe 运算符。

      然后无论你想在哪里获取videoId:

      downloadVideoUrl(query)
          .subscribe(new Subscriber<String>() {
                      @Override
                      public void onCompleted() {
      
                      }
      
                      @Override
                      public void onError(Throwable e) {
      
                      }
      
                      @Override
                      public void onNext(String videoId) {
                          // do whatever you want with videoId
                      }
                  });
      
    2. 使用toBlocking().first()

      Observable 完成之前阻止当前Thread,因此不建议这样做

      @Override
      public String downloadVideoUrl(String query) {
          return youtubeApi.getYoutubeId(query, Constants.youtubeApi)
                  .map(youtubeDataMapper::map)
                  .subscribeOn(subscribeScheduler)
                  .observeOn(observeScheduler)
                  .toBlocking().first();
      }
      

    【讨论】:

      【解决方案2】:

      首先,最好让 Retrofit 返回 Single 而不是 Observable,因为您期望单个服务器响应(而不是响应序列)。

      其次,Completable.complete() 是 Completable 的工厂方法,它什么都不做。所以这里不需要它。

      关于字符串 videoID,这取决于您打算用它做什么。另外,我不知道你的 .addSubscription() 在做什么。

      我建议做以下事情:

      
      class YourClass {
      
          private final CompositeSubscription compositeSubscription = new CompositeSubscription();
          // you must call compositeSubscription.clear() either in class .finalize() or on some UI lifecycle event
      
          void yourMethod() {
              final Single videoID = youtubeApi.getYoutubeId(query, Constants.youtubeApi)
                      .map(youtubeDataMapper::map)
                      .subscribeOn(Schedulers.io())
                      .observeOn(AndroidSchedulers.mainThread());
              final Subscription subscription = videoID.subscribe(new SingleSubscriber() {                    
                    @Override
                    public void onSuccess(String value) {
                              // TODO: do whatever with the value
                          }
                          @Override
                          public void onError(Throwable error) {                         
                              // TODO: log and/or display error
                          }
                      });
             compositeSubscription.add(subscription);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        相关资源
        最近更新 更多