在登录的时候用到这玩意,因为BCrypt的加密太过耗时,在主线程中加密会导致界面卡死,加载圈都出不来。
调用代码如下:
// password = BCrypt.hashpw(password, IConstants.PASSWORD_SALT);// 耗时加密
Observable.just(password)
.flatMap(new Function<String, Observable<BaseResponse<Res_Register>>>() {
@Override
public Observable<BaseResponse<Res_Register>> apply(@NonNull String s) throws Exception {
return RetrofitFactory.getApiUser()
.register(email, BCrypt.hashpw(s, IConstants.PASSWORD_SALT), verify);
}
}).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());
.doOnTerminate(new Action() {
@Override
public void run() throws Exception {
view.hideLoading();
}
}).subscribeWith(new BaseObserver<Res_Register>() {
@Override
protected void onHandleSuccess(Res_Register res_register) {
view.showTipMsg(res_register.getMsg());
view.back2Login();
}
@Override
protected void onHandleError(long code, String msg) {
view.showTipMsg(msg);
}
});
其中Function的泛型左边是传入的数据类型,右边是要返回的数据类型。
这里是传入字符串密码,返回Retrofit接口定义的注册业务的Observable
之后的代码都是类似的。
flatMap可以多次调用,即可以在一个网络请求之后再次请求