Priyank Patel
Priyank Patel

Reputation: 12362

Retrofit2 + RxJava2 + RxAndroid error

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) {

            }
     });

Upvotes: 9

Views: 9240

Answers (4)

Gaket
Gaket

Reputation: 6839

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.

Upvotes: 14

llb
llb

Reputation: 111

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'}

Upvotes: 4

Dinesh Singh
Dinesh Singh

Reputation: 837

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.

Upvotes: 1

iagreen
iagreen

Reputation: 32026

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.

Upvotes: 11

Related Questions