使用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);
                }
            });
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请问您的支付接口是什么?不同的支付接口提供的查询方式可能会有所不同。在没有更多信息的情况下,我可以提供一个简单的示例来说明如何轮询查询支付结果。 假设您的支付接口提供了一个查询订单状态的 API,您可以使用 Java 中的 Timer 和 TimerTask 类来实现轮询查询。具体实现步骤如下: 1. 定义一个 Timer 对象,在 30 秒后开始执行查询任务。 ``` Timer timer = new Timer(); timer.schedule(new QueryTask(), 30000); ``` 2. 定义一个 TimerTask 对象,用于执行查询任务。查询任务应该包括以下步骤: - 调用支付接口的查询订单状态 API,获取订单状态。 - 如果订单状态为成功,则返回支付结果。 - 如果订单状态为失败,则取消订单并返回失败信息。 - 如果订单状态为未支付或者支付中,则继续轮询查询。 ``` class QueryTask extends TimerTask { @Override public void run() { String orderId = "your_order_id"; // 替换成实际的订单号 String status = ""; // 订单状态 // 调用支付接口的查询订单状态 API,获取订单状态 // ... if ("success".equals(status)) { // 订单支付成功,返回支付结果 // ... } else if ("fail".equals(status)) { // 订单支付失败,取消订单并返回失败信息 // ... } else { // 订单支付或者支付中,继续轮询查询 Timer timer = new Timer(); timer.schedule(new QueryTask(), 30000); } } } ``` 请注意,这只是一个简单的示例,具体实现方式取决于您的支付接口提供的查询方式和您的业务需求。在实际开发中,您需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值