0%

使用Rxjava3+Retrofit2+AutoDispose2整合网络请求

Rxjava3已经正式发布,是时候把曾经的Rxjava2升级了。

准备依赖

依赖除了需要Rxjava3Retrofit2Autodispose2相关以外,还引入了Moshi用来处理Json序列化。由于没有官方的adapter-rxjava3,这里在github上找到了开源版本。

1
2
3
4
5
6
7
8
9
implementation "io.reactivex.rxjava3:rxkotlin:3.0.0"
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.8.1'
implementation 'com.squareup.retrofit2:converter-moshi:2.8.1'
implementation 'com.github.fairytale110:adapter-rxjava3:2.7.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1'
implementation "com.squareup.moshi:moshi-kotlin:1.9.2"
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.9.2"
implementation 'com.uber.autodispose2:autodispose-androidx-lifecycle:2.0.0'

RxJava3(RxKotlin3) + Retrofit2 搭建网路请求

一般的搭建方法

首先来构建Retrofit实例,BaseURL以玩安卓为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.client(
OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build()
)
.baseUrl("https://www.wanandroid.com")
.build()
}

接下来完成请求接口。

1
2
3
4
5
6
interface ApiService {
@GET("wxarticle/chapters/json")
fun a(): Observable<Enttity>
}

object Api : ApiService by retrofit.create(ApiService::class.java)

完成Enttity这个实体类, 使用converter-moshi的时候,一定要注意在实体类上添加注解@JsonClass(generateAdapter = true)

1
2
3
4
5
6
7
8
9
10
11
12
13
@JsonClass(generateAdapter = true)
data class Enttity(
val data: List<Data>,
val errorCode: String,
val errorMsg: String
)


@JsonClass(generateAdapter = true)
data class Data(
val id: Int,
val name: String
)

现在可以调用网络请求接口试一下了。

1
2
3
4
5
6
Api.a()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d(TAG, it.toString())
}

简化

按照上面的搭建,我们会发现每一次调用网络请求接口,都需要手动去切换线程.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())。在网络请求接口非常多时候,这可不是一个好办法。接下来使用compose操作符把线程切换封装起来。

1
2
3
4
5
6
fun <T> applySchedulers(): ObservableTransformer<T, T> {
return ObservableTransformer<T, T> {
it.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
}
1
2
3
4
5
Api.a()
.compose(applySchedulers())
.subscribe {
Log.d(TAG, it.toString())
}

处理内存泄漏

以往处理内存泄漏的方法是使用RxLifecycle,但是这种方法需要自己的Activty去继承RxAppCompatActivity, 侵入性比较高。使用AutoDispose可以完美解决这个问题,只需要添加一张代码即可。

1
2
3
4
5
6
Api.a()
.compose(applySchedulers())
.autoDispose(this) // 只需要一行代码
.subscribeBy {
Log.d(TAG, it.toString())
}

这里传入的thisLifecycleOwner类型, 通过查看AppCompatActivity可以发现它的基类ComponentActivity实现了LifecycleOwner接口。

1
2
3
4
5
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {···}

那么autoDispose(this)会在什么时候自动取消订阅呢,通过查阅源码可以发现取消订阅的生命周期与Activity的生命周期是对应的。

Activity AutoDispose
onCreate onDestroy
onStart onStop
onResume onPause
onPause onStop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
autodispose2.androidx.lifecycle.AndroidLifecycleScopeProvider

public final class AndroidLifecycleScopeProvider
implements LifecycleScopeProvider<Lifecycle.Event> {

private static final CorrespondingEventsFunction<Lifecycle.Event> DEFAULT_CORRESPONDING_EVENTS =
lastEvent -> {
switch (lastEvent) {
case ON_CREATE:
return Lifecycle.Event.ON_DESTROY;
case ON_START:
return Lifecycle.Event.ON_STOP;
case ON_RESUME:
return Lifecycle.Event.ON_PAUSE;
case ON_PAUSE:
return Lifecycle.Event.ON_STOP;
case ON_STOP:
case ON_DESTROY:
default:
throw new LifecycleEndedException("Lifecycle has ended! Last event was " + lastEvent);
}
};
}