需求:在刷卡接口请求成功后,弹出一个等待刷卡的对话框,每隔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)
}
}