Rxjava3已经正式发布,是时候把曾经的Rxjava2升级了。
准备依赖 依赖除了需要Rxjava3
、Retrofit2
、Autodispose2
相关以外,还引入了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()) }
这里传入的this
是LifecycleOwner
类型, 通过查看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); } }; }