web-dev-qa-db-ja.com

Retrofit2 + RxJava2 + RxAndroidエラー

Subscriberを作成してサブスクライブしようとすると、次のようなエラーメッセージが表示されます。

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<GooglePlacesResponse>は以下の通りです。

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

            }
     });
8
Priyank Patel

RxJavaCallAdapterはRxJava1 Observableを返します。 RxJava2には RxJava2CallAdapter を使用する必要があります。それはまだ公式のレトロフィットリリースにはないようですが、2.1.1スナップショットにはあります。アダプターを自分でコンパイルするか、sonatypeスナップショットリポジトリから依存関係をプルすることができます。

build.gradlerepositoriesセクションに以下を追加します---

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

レトロフィットの依存関係を2.1.1-SNAPSHOTバージョンに更新します。 adapter-rxjavaadapter-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'

RxJava2CallAdapterFactoryを使用するようにレトロフィットビルダーを更新します---

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

2.1.1がリリースされると、通常の依存関係に戻ることができます。

11
iagreen

アダプタのバージョンが2.*.*であるという事実は、それがRxJava2での使用を目的としていることを意味するものではありません。

RxJavaのsecondバージョンの公式アダプターを使用する必要があります。

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

次に、ファクトリを追加できます。

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

これが 完全な答え です。

13
Gaket

これが私のbuild.gradle設定です、おそらくこれは他の人を助けるでしょう

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

レトロフィットバージョンを更新したくない場合。 Here は、_RxJava1.x_から_RxJava2.x_オブジェクトへの変換に最適なライブラリの1つです。まず、これを追加します
_compile "com.github.akarnokd:rxjava2-interop:0.10.2"_
to _build.gradle_ and Use method
RxJavaInterop.toV2Observable(observableRx1)
Rx2Observablesに変換します。

1
Dinesh Singh