1. 程式人生 > >RxJava請求資料的回撥方法在主執行緒處理

RxJava請求資料的回撥方法在主執行緒處理

RxJava的Observer的介面回撥方法如下:

Subscriber<String> subsciber = new Subscriber<String>() {
    @Override
    public void onCompleted() {
        Log.d("tag", "onCompleted()");
    }
  
    @Override
    public void onError(Throwable e) {
        Log.d("tag", "onError() e=" + e);
    }
  
    @Override
    public void onNext(String s) {
        Log.d("tag", "onNext() data=" + s);
    }
}

但是在onNext()我們拿到資料的同時,要在主執行緒賦值給控制元件,這時候就會報錯,因為RxJava預設的資料回撥是在子執行緒中的。

所以,我們要在程式碼中新增如下兩行程式碼:

 .subscribeOn(Schedulers.computation())
 .observeOn(AndroidSchedulers.mainThread())

整個方法如下:

    //請求網路資料
    public void getData(BaseRequestBean baseRequestBean, Observable<Object> observable,  final IBaseModel.onGetDataFinishedListener listener){
        if(baseRequestBean!=null&&!StringUtils.isEmpty(baseRequestBean.getRequest_url())){
            if(mCompositeSubscription!=null){
                mCompositeSubscription.add(observable
                        .subscribeOn(Schedulers.computation())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Observer<Object>() {
                            @Override
                            public void onCompleted() {
                                listener.onComplete();
                            }

                            @Override
                            public void onError(Throwable e) {
                                listener.onError("出錯了");
                            }

                            @Override
                            public void onNext(Object result) {
                                listener.onSuccess(result);
                            }
                        })
                );
            }
        }else{
            listener.onError("");
        }
    }

這樣就不會造成執行緒的阻塞了。

專案地址:https://github.com/xuwennengcan/canUtils