Skip to content

指定请求、回调线程

liujingxing edited this page Feb 25, 2023 · 9 revisions

RxHttp默认在IO线程执行请求,也默认在IO线程回调,通过以下操作,我们可以指定请求和回调所在线程。

1、同步请求

使用syncRequest操作符将异步请求改为同步,如下:

RxHttp.get("/service/...")
    .toObservableString()  
    .syncRequest()    //同步请求
    .subscribe(s -> { //同步请求,在当前线程回调
        //成功回调
    }, throwable -> {
        //异常回调
    });

或者,直接调用一系列executeXxx方法,直接获取返回值

User user = RxHttp.get("")                
    .add("key","value")       
    .executeClass(User.class);

以上两种同步请求,区别在于,前者通过回调方式同步,后者通过返回值方式同步。

2、指定回调所在线程

指定回调所在线程,使用RxJava的线程调度器,如下:

//指定回调所在线程,需要在第二部曲后调用
RxHttp.get("/service/...")
    .toObservableString()  
    .observeOn(AndroidSchedulers.mainThread()) //指定在主线程回调
    .subscribe(s -> { //s为String类型,主线程回调
        //成功回调
    }, throwable -> {
        //异常回调
    });

亦或者使用RxLife指定回调线程,如下:

//当前环境为FragmentActivity/Fragment/View
RxHttp.get("/service/...")
    .toObservableString()  
    .to(RxLife.toMain(this)) //指定在主线程回调,并且在页面销毁时,自动关闭请求
    .subscribe(s -> { //s为String类型,主线程回调
        //成功回调
    }, throwable -> {
        //异常回调
    });

注意:以上.to(RxLife.toMain(this))是RxJava3的用法,RxJava2请使用.as(RxLife.asOnMain(this))替代