How to return value in rxJava

android, rx-java

Solution

You have two choices:

Make your `downloadVideoUrl` return `Observable` instead of `Completable`:

Preferred way:

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

Notice lack of `subscribe` operator here.

Then wherever you want to get 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
                }
            });

Use `toBlocking().first()`

This is not preffered as you block current `Thread` until `Observable` finishes

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

Problem

I'm new into rxJava and it's making my head spin. Basically I'm pulling data from youtube api with retrofit which gives back Observable and with youtubeDataMapper I'm mappng it into Youtube Pojo object which contains String videoID. So my question is, how to make this method return that string instead of Completable? This is my method: ``` @Override public Completable downloadVideoUrl(String query) { addSubscription(youtubeApi.getYoutubeId(query, Constants.youtubeApi) .map(youtubeDataMapper::map) .subscribeOn(subscribeScheduler) .observeOn(observeScheduler) .subscribe()); return Completable.complete(); } ```

Original source