如何在rxJava中返回值

hyr*_*k16 7 android rx-java

我是rxJava的新手,它让我头晕目眩.基本上我正在通过改造从youtube api中提取数据,这将改回Observable和youtubeDataMapper,我将它转换为包含String 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();
}
Run Code Online (Sandbox Code Playgroud)

R. *_*ski 6

你有两个选择:

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

    首选方式:

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

    注意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
                    }
                });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 toBlocking().first()

    当你阻止当前Thread直到Observable完成时,这不是优先的

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