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。
我的代码是:
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。