-
-
Notifications
You must be signed in to change notification settings - Fork 459
关闭请求
liujingxing edited this page Feb 25, 2023
·
4 revisions
RxJava自动关闭请求
自动关闭请求,需要引入本人开源的另一个库RxLife,先来看看如何用:
//以下代码均在FragmentActivty/Fragment中调用
RxHttp.postForm("/service/...")
.toObservable(Book.class)
.to(RxLife.to(this)) //页面销毁、自动关闭请求
.subscribe();
//注:RxJava2使用.as(RxLife.as(this))替代 Kotlin环境下使用.life(this)替代
RxHttp.postForm("/service/...")
.toObservable(Book.class)
.to(RxLife.toMain(this)) //页面销毁、自动关闭请求 并且在主线程回调观察者
.subscribe();
//注:RxJava2使用.as(RxLife.asOnMain(this))替代 Kotlin环境下使用.lifeOnMain(this)替代
上面的this
为LifecycleOwner
接口对象,我们的FragmentActivity/Fragment均实现了这个接口,所有我们在FragmentActivity/Fragment中可以直接传this
。
对RxLife
不了解的同学请查看RxLife 史上最优雅的管理RxJava生命周期,这里不详细讲解。
协程Await/Flow自动关闭请求
在FragmentActivity/Fragment
中,使用lifecycleScope
开启协程,在ViewModel
中,使用viewModelScope
开启协程,此时页面销毁时,协程会自动关闭,并且自动关闭请求,如下:
//1、Await
//viewModelScope开启协程同理
lifecycleScope.launch {
val book = RxHttp.get("/service/...")
.toAwait<Book>()
.tryAwait {
//异常回调
}
//book != null,即代表请求成功
}
//2、Flow
//viewModelScope开启协程同理
lifecycleScope.launch {
RxHttp.get("/service/...")
.toFlow<Book>()
.catch {
//异常回调
}.collect {
//成功回调
}
}
RxJava手动关闭请求
手动关闭请求,我们只需要在订阅回调的时候拿到Disposable对象,通过该对象可以判断请求是否结束,如果没有,就可以关闭请求,如下:
//订阅回调,可以拿到Disposable对象
Disposable disposable = RxHttp.get("/service/...")
.toObservable(Book.class) //kotlin环境下,可使用toObservable<Book>()替代
.subscribe(book -> {
//成功回调
}, throwable -> {
//失败回调
});
if (!disposable.isDisposed()) { //判断请求有没有结束
disposable.dispose(); //没有结束,则关闭请求
}
协程Await/Flow手动关闭请求
通过launch
方法拿到Job
对象,调用cancel
方法即可关闭协程,并关闭请求,如下:
//1、Await
//viewModelScope开启协程同理
val job = lifecycleScope.launch {
val book = RxHttp.get("/service/...")
.toAwait<Book>()
.tryAwait {
//异常回调
}
//book != null,即代表请求成功
}
job.cancel(); //关闭协程并关闭请求
//2、Flow
//viewModelScope开启协程同理
val job1 = lifecycleScope.launch {
RxHttp.get("/service/...")
.toFlow<Book>()
.catch {
//异常回调
}.collect {
//成功回调
}
}
job1.cancel(); //关闭协程并关闭请求
任意方式发请求,可为每个请求指定一个tag,如下:
RxHttp.postForm("/service/...")
.tag("testTag")
...
随后便可以通过tag关闭请求,如下:
//关闭默认OkHttpClient对象指定tag的所有请求
RxHttpPlugins.cancelAll("testTag")
//关闭某个OkHttpClient对象指定tag的所有请求
RxHttpPlugins.cancelAll(OkHttpClient, "testTag")
//关闭默认OkHttpClient对象的所有请求
RxHttpPlugins.cancelAll()
//关闭某个OkHttpClient对象的所有请求
RxHttpPlugins.cancelAll(OkHttpClient)