参考:RxJava2 只看这一篇文章就够了
private void showLoginDialog() {
try {
Log.d(TAG, "showLoginDialog");
showLoading();
Observable.create(new ObservableOnSubscribe<QrParams>() {
@Override
public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<QrParams> emitter) throws Exception {
JsonObject data = new JsonObject();
data.addProperty("app", "gnetlink");
data.addProperty("service", "identity");
data.addProperty("action", "login");
//data.addProperty("uid", "");
String encryptData = QrCodeUtils.encryptQrData(data);
if (TextUtils.isEmpty(encryptData)) {
LogUtils.e(TAG, "encryptData is empty");
emitter.onError(new Exception("encryptData is empty"));
}
emitter.onNext(new QrParams(QrCodeUtils.QrType.LOGIN, encryptData));
emitter.onComplete();
}
}).flatMap(new Function<QrParams, ObservableSource<QrEntity>>() {
@Override
public ObservableSource<QrEntity> apply(@io.reactivex.annotations.NonNull QrParams qrParams) throws Exception {
return HttpUtils.getInstance().create(EasService.class).qrCode(qrParams);
}
}).map(new Function<QrEntity, Bitmap>() {
@Override
public Bitmap apply(@io.reactivex.annotations.NonNull QrEntity response) throws Exception {
logonUrl = response.getUrl();
logonUrl = removeParamFromUrl(logonUrl, "validTime") + "&type=ef1e_login";
LogUtils.stack(TAG, "url:" + logonUrl);
return QrCodeUtils.syncEncodeQRCode(logonUrl, mContext.getResources().getDimensionPixelSize(R.dimen.user_res_qr_code_size), QrCodeUtils.Type.LOGIN);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) //下游方法主线程执行
.subscribe(new DefaultObserver<Bitmap>() {
@Override
public void onNext(Bitmap bitmap) {
LogUtils.d(TAG, "getLoginQrCode onNext, bitmap: " + bitmap);
hideLoading();
showQrCodeResult(bitmap);
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
LogUtils.e(TAG, "getLoginQrCode onError " + throwable.getMessage());
hideLoading();
showQrCodeResult(null);
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}