Skip to content

关闭请求

liujingxing edited this page Feb 25, 2023 · 4 revisions

1、自动关闭请求

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)替代

上面的thisLifecycleOwner接口对象,我们的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 {                   
            //成功回调                            
        }                              
}                                       

2、手动关闭请求

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(); //关闭协程并关闭请求                        

3、根据tag关闭请求

任意方式发请求,可为每个请求指定一个tag,如下:

RxHttp.postForm("/service/...")
    .tag("testTag")
    ...

随后便可以通过tag关闭请求,如下:

//关闭默认OkHttpClient对象指定tag的所有请求
RxHttpPlugins.cancelAll("testTag")

//关闭某个OkHttpClient对象指定tag的所有请求
RxHttpPlugins.cancelAll(OkHttpClient, "testTag")

4、关闭所有请求

//关闭默认OkHttpClient对象的所有请求
RxHttpPlugins.cancelAll()

//关闭某个OkHttpClient对象的所有请求
RxHttpPlugins.cancelAll(OkHttpClient)