使用Rxjava对订单支付结果进行轮询

/**关键代码片段**/
//轮询服务器次数
private int checkTime = 0;
private boolean orderPaySuccess = false;

public void CheckPayStatue() {

    LogUtils.e("Rx定时器", "CheckPayStatue");

    YiDianHttp.getService().checkOrderIsPay(mOrderNo).repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
        @Override
        public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
            // 将原始 Observable 停止发送事件的标识(Complete() /  Error())转换成1个 Object 类型数据传递给1个新被观察者(Observable)
            // 以此决定是否重新订阅 & 发送原来的 Observable,即轮询
            // 此处有2种情况:
            // 1. 若返回1个Complete() /  Error()事件,则不重新订阅 & 发送原来的 Observable,即轮询结束
            // 2. 若返回其余事件,则重新订阅 & 发送原来的 Observable,即继续轮询
            return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
                @Override
                public ObservableSource<?> apply(@NonNull Object throwable) throws Exception {

                    // 加入判断条件:当轮询次数 = 5次后,就停止轮询
                    if (checkTime > 3) {
                        // 此处选择发送onError事件以结束轮询,因为可触发下游观察者的onError()方法回调
                        /**处理轮询结束的结果 1、结束时订单支付成功 2、结束时订单支付失败**/
                        if(!orderPaySuccess){
                            LogUtils.e("Rx定时器","轮询结束,订单支付失败");
                        }
                        return Observable.error(new Throwable("轮询结束"));
                    }
                    // 若轮询次数<4次,则发送1Next事件以继续轮询
                    // 注:此处加入了delay操作符,作用 = 延迟一段时间发送(此处设置 = 1.5s),以实现轮询间间隔设置
                    return Observable.just(1).delay(1500, TimeUnit.MILLISECONDS);
                }
            });
        }
    }).subscribeOn(Schedulers.io())               // 切换到IO线程进行网络请求
            .observeOn(AndroidSchedulers.mainThread())  // 切换回到主线程 处理请求结果
            .subscribe(new BaseObserver<BaseResponse>(_mActivity, mDisposable) {

                @Override
                protected void onSuccess(BaseResponse bean) {

                    if(bean.getCode()==1001){
                        checkTime = 5;
                        orderPaySuccess =true;
                        LogUtils.e("Rx定时器", "轮询结果(已支付)");
                        ((PayDelegate) getParentFragment()).start(PayResultDelegate.newInstance(payType, mOrderNo, ((PayDelegate) getParentFragment()).mMoney, mPayFlag), SupportFragment.SINGLETASK);
                        WeiboDialogUtils.closeDialog(mWeiboDialog);
                    }else {
                        LogUtils.e("Rx定时器", "轮询结果-订单未支付,当前轮询次数:"+checkTime);
                        orderPaySuccess=false;
                        checkTime++;
                    }
                }
                @Override
                protected void onFailure(int code, String msg) {

                    checkTime++;
                    orderPaySuccess=false;
                    LogUtils.e("Rx定时器", "查询订单失败--订单未支付,将继续轮询,当前轮询次数:"+checkTime);
                    WeiboDialogUtils.closeDialog(mWeiboDialog);
                    /**190116增**/
                    Hawk.delete(HawkConstant.OREDR);
                }
            });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值