Handler实现轮询-kotlin

需求:在刷卡接口请求成功后,弹出一个等待刷卡的对话框,每隔5秒轮询去查询订单详情接口(根据订单号查),当订单详情接口中的支付状态为已支付时,移除对话框和轮询

private var mTimedHandler: TimedHandler? = null//初始化一个handler
 private var mPayWaitingDialog: BaseDialog? = null//初始化一个对话框
  mTimedHandler = TimedHandler(this)//调用它
//刷卡接口回调
mViewModel.payOrderCardCallBack.observe(mActivity) { it ->
            if (it.isSuccess) { 
            //对话框创建
              mPayWaitingDialog = context?.let {
                    PayWaitingDialog.Builder(it)
                        .setBackgroundDimEnabled(true)
                        .setBackgroundDimAmount(0.5f)
                        .setOnClickListener(
                            R.id.btn_cancel,
                            object : BaseDialog.OnClickListener<ScaleTextButton> {
                                override fun onClick(dialog: BaseDialog?, view: ScaleTextButton) {
                                    dialog?.dismiss()
                                }
                            })
                        .setWidth((ScreenUtils.getScreenWidth(mActivity) * 0.3).toInt())
                        .setHeight((ScreenUtils.getScreenHeight(mActivity) * 0.5).toInt())
                        .create()
                }
                mPayWaitingDialog!!.show()
                
                var msg = Message()
                var bundle = Bundle()
                bundle.putLong("id", it.data!!.id)
                msg.data = bundle
                msg.what = 1
                mTimedHandler!!.sendMessageDelayed(msg, 5000)//将上面的msg内容发送到handler,在5秒后

            }

        }
//订单详情接口回调
 mViewModel.orderDetailCallBack.observe(mActivity) {
            if (it.isSuccess) {
                if (it.data != null) {
                    mViewModel.test.set(it.data.paymentStatus)//2表示支付成功
                    if (mViewModel.test.get() == 2) {
                    //对话框销毁
                        mPayWaitingDialog?.dismiss()

                        if(mTimedHandler!=null){
                            mTimedHandler!!.removeCallbacksAndMessages(null)//paymentStatus为2时,移除轮询
                        }
                        

                    }

                }
            }

        }
//handler内部类,这样写防止内存泄漏
 private class TimedHandler internal constructor(activity: CreateOrderFragment) : Handler() {
//弱引用
         var mReference: WeakReference<CreateOrderFragment>
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            var mContext=mReference.get()

            if(msg.what==1){
              //获取上面bundle传的值“id”,并传给请求的接口,id为订单号
                var bundle=msg.data
                var orderId=bundle.getLong("id")
                mContext!!.mViewModel.orderDetail(mContext.mActivity,orderId)

                var msg1 = Message()
                var bundle1 = Bundle()
                bundle1.putLong("id", orderId)
                msg1.data = bundle1
                msg1.what = 1
//msg.what为1时每间隔5秒执行一次handler(请求一次接口)
                sendMessageDelayed(msg1, 5000)
            }
        }
        init {
            mReference = WeakReference(activity)
        }

    }
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值