Retrofit2 + RxJava2 + RxAndroid error

9.2k views Asked by At

I am getting error message as below when try to crate Subscriber and subscribe.

can not resolve method 'subscribe(anonymous rx.Subscriber<GooglePlacesResponse>)'

build.gradle

// JSON Parsing
compile 'com.google.code.gson:gson:2.6.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.2'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1

GooglePlaceService.java

public interface GooglePlaceService {

    public static final String GOOGLE_API_KEY = "google_api_key";

    @GET("maps/api/place/nearbysearch/json?radius=2000&key="+GOOGLE_API_KEY)
    Observable<GooglePlacesResponse> getNearbyPlaces(@Query("location") String location);
}

ApiUtils.java

public class ApiUtils {    

    public static final String GOOGLE_PLACE_BASE_URL = "https://maps.googleapis.com/";

    public static GooglePlaceService getGooglePlaceService() {
        return getClient(GOOGLE_PLACE_BASE_URL).create(GooglePlaceService.class);
    }

    public static Retrofit getClient(String baseUrl) {

        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(baseUrl)
                .build();

        return retrofit;
    }
}

Observable Observable<GooglePlacesResponse> is as below.

Observable<GooglePlacesResponse> mGooglePlacesResponseObervable = ApiUtils.getGooglePlaceService().getNearbyPlaces(latitude + "," + longitude);

mGooglePlacesResponseObervable
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(new Subscriber<GooglePlacesResponse>() { <-- Error here : can not resolve method `subscribe(anonymous rx.Subscriber<GooglePlacesResponse>)`

            @Override
            public void onNext(GooglePlacesResponse googlePlacesResponse) {

                }

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }
     });
4

There are 4 answers

0
iagreen On BEST ANSWER

RxJavaCallAdapter returns a RxJava 1 Observable. You should use RxJava2CallAdapter for RxJava2. Looks like that is not in an official retrofit release yet, but is in the 2.1.1 snapshot. You can either compile the adapter yourself, or pull the dependencies off the sonatype snapshot repo.

Add the following to your repositories section in your build.gradle --

repositories {
    // Other repos...
    maven {
        url = "https://oss.sonatype.org/content/repositories/snapshots/"
    }
}

Update your retrofit dependencies to the 2.1.1-SNAPSHOT version. Note that we also change adapter-rxjava to adapter-rxjava2 --

compile 'com.squareup.retrofit2:retrofit:2.1.1-SNAPSHOT'
compile 'com.squareup.retrofit2:converter-gson:2.1.1-SNAPSHOT'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.1.1-SNAPSHOT'

and update your retrofit builder to use RxJava2CallAdapterFactory --

Retrofit retrofit = new Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(baseUrl)
            .build();

When 2.1.1 is released, you can go back to the regular dependencies.

0
llb On

Here is my build.gradle setting, perhaps this would help others

depencies{
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'}
1
Gaket On

The fact that adapter has version 2.*.* does not mean that it is intended for use with RxJava 2

You should use the official adapter for the second version of RxJava:

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' // works with RxJava 2

Then you can add factory:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com")
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build();

Here is the full answer.

0
Dinesh Singh On

If you do not want to update the retrofit version. Here is one very good library to convert to and from RxJava1.x to RxJava2.x objects. First, add this
compile "com.github.akarnokd:rxjava2-interop:0.10.2"
to build.gradle and Use method
RxJavaInterop.toV2Observable(observableRx1)
to convert to Rx2 Observables.