【问题标题】:Retrofit2 + RxJava2 + RxAndroid errorRetrofit2 + RxJava2 + RxAndroid 错误
【发布时间】:2017-05-09 19:34:54
【问题描述】:

尝试创建 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&lt;GooglePlacesResponse&gt;如下。

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

            }
     });

【问题讨论】:

    标签: java android retrofit2 rx-android rx-java2


    【解决方案1】:

    适配器的版本为2.*.* 并不意味着它旨在与 RxJava 2 一起使用

    你应该使用 second 版本的 RxJava 的官方适配器:

    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();
    

    这里是full answer

    【讨论】:

    • 这真的救了我。
    【解决方案2】:

    这是我的 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'}
    

    【讨论】:

      【解决方案3】:

      如果您不想更新改造版本。 Here 是一个非常好的库,可以在 RxJava1.xRxJava2.x 对象之间进行转换。 首先添加这个
      compile "com.github.akarnokd:rxjava2-interop:0.10.2"
      转至build.gradle和使用方法
      RxJavaInterop.toV2Observable(observableRx1)
      转换为 Rx2 Observables。

      【讨论】:

        【解决方案4】:

        RxJavaCallAdapter 返回一个 RxJava 1 Observable。对于 RxJava2,您应该使用 RxJava2CallAdapter。看起来这还没有在官方改造版本中,但在 2.1.1 快照中。您可以自己编译适配器,也可以从 sonatype 快照存储库中提取依赖项。

        将以下内容添加到build.gradle 中的repositories 部分--

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

        将您的改造依赖项更新为2.1.1-SNAPSHOT 版本。请注意,我们还将adapter-rxjava 更改为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'
        

        并更新您的改造构建器以使用RxJava2CallAdapterFactory --

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

        当 2.1.1 发布时,您可以回到常规依赖项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-14
          • 2017-12-08
          • 2018-03-09
          • 1970-01-01
          相关资源
          最近更新 更多