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(); } }