0

我的代码是:

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

构建.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 来工作

4

2 回答 2

1

是的,没错,你的 api 客户端必须返回 Observable。改造库可以利用“适配器工厂”返回可观察值。如果这是您的自定义 RestClient 并且您手动创建 Observable,请不要忘记使用 Observable.defer(()-> yourTask)。有一个名为 Retrolambda 的库,它允许使用 lambda,但是,我遇到了一个问题,它不适用于最新的 AndroidStudio,AndroidStudio 建议改用 Jack。现在我使用 Retrolambda。

于 2016-11-06T23:22:04.263 回答
1

如果您要使用 Retrofit 和 Rx,请不要忘记为 Rx 添加呼叫适配器。

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

如果你这样做,那么你做对了。为了更好的映射,rest 客户端应该返回一个带有你的对象的 Observable,就像Observable<List<Movie>> getApiMovie();这将返回一个电影列表。Movie 对象应该包含来自 api 的所有属性,并用@SerializedName("objectName").

因为您使用的是 RxJava 2,所以使用.addCallAdapterFactory(RxJava2CallAdapterFactory.create())with dependency compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'。更多细节在这里

于 2016-11-07T08:58:45.307 回答