Android RxJava2:如何设置正确的异步可观察对象使用 REST API?

Android RxJava2 : how setup a right async observable consuming REST API?

我的代码是:

RestClient client = new RestClient();
        Disposable subscribe = client.getApiMovie().getTopRated()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( data -> { Log.d("mytag", data.body().toString()) });

那个代码对吗? PS:我正在使用 Android Studio 2,如何设置才能使用 lambda 表达式?

我的 RestClient 构造函数:

//what adapter shall I use?
    public RestClient(){
            if( client == null ) {
                client = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(getHttpClient())
                        .build();
            }
        }

build.gradle:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.example.username.sunshine.app"
        minSdkVersion 21
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Lambda 语法现在应该可以通过添加 jackOptions 和 compileOptions

是的,没错,您的 api 客户端必须 return Observable。 Retrofit 库可以利用 'adapter factory' 作为 returning observables。 如果这是您的自定义 RestClient 并且您手动创建 Observable,请不要 忘记使用 Observable.defer(()- > yourTask)。 有一个名为 Retrolambda 的库,它允许使用 lambda,但是,我遇到了一个问题,它不适用于最新的 AndroidStudio,而 AndroidStudio 建议改用 Jack。现在我使用 Retrolambda。

如果你打算将 Retrofit 与 Rx 一起使用,请不要忘记为 Rx 添加调用适配器。

client = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(getHttpClient())
                    .build();

如果你这样做,你就做对了。为了更好的映射,rest client 应该 return 一个带有你的对象的 Observable,比如 Observable<List<Movie>> getApiMovie(); 这将 return 一个电影列表。 Movie 对象应包含来自 api 并用 @SerializedName("objectName") 注释的所有属性。

因为您使用的是 RxJava 2,所以使用 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 和依赖项 compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'。此处有更多详细信息 here