转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7657194.html

一:应用场景

在诸如自动售卖机之类的扫码支付场景中,客户端在获得支付二维码或者发出支付请求之后,需要在一定时间内轮询服务器,查询支付结果以便作出下一步应答。

这种轮询,不是长时间、定时的轮询,只需在等待支付的时间内(如:60秒内)轮询即可,这样的话,网上大部分轮询方案(AlarmManager + BroadcastReceiver + Service)就显得太笨重而不适用了。

我们观察到,支付时间内的轮询,是“在时间段内,重复进行某操作”,这样很容易就联想到android的一个工具——计时器CountDownTimer。

二:轮询方法

我们可以在发起支付请求后,启动一个CountDownTimer,让它从一个时间点开始倒数,例如:60秒,并且指明每次倒数间隔,例如:1秒,这样就倒数60秒,每秒数一下。

重写计时器的onTick()方法,指定每次倒数时执行的操作,我们可以在这个方法中向服务器发出支付结果查询请求,接收到响应后,根据响应结果不同,发送message到UI线程的handler,handler根据消息的不同,进行不同的后续操作(跳转到不同页面、弹出支付结果提示等)。

三:核心代码示例

timer = new CountDownTimer(60000, 1000) {

            @Override
public void onTick(long millisUntilFinished) {
//在计时器中轮询支付结果:每秒查询一次支付结果
Request request = new Request.Builder()
.url("服务器查询支付结果的url")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//发起查询失败:可能由于某些原因,不能成功发起查询
e.printStackTrace();
} @Override
public void onResponse(Call call, Response response) throws IOException {
String jsonData = new String(response.body().bytes(),"utf-8");
int res_code = Integer.valueOf(jsonData); //这里我是用1、0、-1来表示支付结果的
if(res_code == 1){//支付成功
Message message = new Message();
message.what=PAY_SUCCESS;
mHandler.sendMessage(message);
}else if(res_code == -1){//支付失败
Message message = new Message();
message.what=PAY_FAIL;
mHandler.sendMessage(message);
}
}
});
} @Override
public void onFinish() {
//倒数到0时的操作,一般认为倒数到0仍未收到支付结果,则认为支付失败,页面跳转
}
};
timer.start();

在handler中,根据message进行不同的后续操作(切记:跳转前,要停止计数器),这个具体情况具体定义,我就不贴代码了。

Android短轮询解决方案——CountDownTimer+Handler的更多相关文章

  1. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  2. http长轮询&短轮询

    http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...

  3. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  4. HTTP长轮询和短轮询

    http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...

  5. HTTP协议中的短轮询、长轮询、长连接和短连接

    HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...

  6. 关于ajax的短轮询问题

    利用前台的ajax不断向后台服务器请求,后台服务器不断查看数据库里的信息是否变化.若变化将信息返回前台,并执行一些操作 前台ajax代码 注意要加上cache这一项,如果是post请求的化,可以免了. ...

  7. HTTP协议中的短轮询、长轮询、长连接和短连接,看到一篇文章有感

    关于短轮询.长轮询 短轮询主要是前端实现,JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询. 长轮询主要取决于服务器,在长轮询中,服务器如果检测到数据 ...

  8. 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    作者:伯乐在线专栏作者 - 左潇龙 http://web.jobbole.com/85541/ 如有好文章投稿,请点击 → 这里了解详情 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此 ...

  9. HTTP协议中的长连接、短连接、长轮询、短轮询

    长连接.短连接,指的是TCP连接.长连接是为了复用TCP连接. 长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒).在这个时间里,服务器会 ...

随机推荐

  1. cocos2d-x 在输入文字时点击语音crash

    修改CCDirectorCaller.mm文件 (cocos2dx/platform/ios/CCDirectorCaller.mm)   添加的代码: #import <OpenGLES/EA ...

  2. 实用ExtJS教程100例-008:使用iframe填充ExtJS Window组件

    上面两节中我们分别演示了ExtJS Window的常用功能 和 如何最小化ExtJS Window组件,在这篇内容中我们来演示一下如何使用iframe填充window组件. 思路很简单,首先创建一个w ...

  3. Easyui numberbox获取焦点事件

    Html文件: <input id="auctionBrandNoGetByHand" style="width:160px;" class=" ...

  4. C# WebBrowser控件使用整理

    一.简介 WebBrowser 控件为 WebBrowser ActiveX 控件提供了托管包装. 托管包装使您可以在 Windows 窗体客户端应用程序中显示网页. 使用WebBrowser 控件, ...

  5. 内存数据库-H2简介与实践

    一.H2数据库介绍 H2数据库地址:http://www.h2database.com/html/main.html H2是一个开源的嵌入式(非嵌入式设备)数据库引擎,它是一个用Java开发的类库,可 ...

  6. sklearn中SVM调参说明

    写在前面 之前只停留在理论上,没有实际沉下心去调参,实际去做了后,发现调参是个大工程(玄学).于是这篇来总结一下sklearn中svm的参数说明以及调参经验.方便以后查询和回忆. 常用核函数 1.li ...

  7. C#多线程写日志

    由于程序是3层架构的,所有多线程记录日志成了比较棘手的问题,以前还真就没有在意过写日志的问题,认为不过是写文件罢了~~!如今发现原来要实现文件共享,并且能够使多线程同时操作日志还不能相互冲突,真的很麻 ...

  8. 使用rsync实现客户端与服务器端的文件同步与传送,重点是原理和参数解释

    1.什么是rsync?-rsync是类unix系统下的数据镜像备份工具——remote sync.一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机 ...

  9. [转]教你修复win7中复制粘贴失效的问题

    教你修复win7中复制粘贴失效的问题 发布时间:2018-01-17             使用win7系统的时候,我们经常需要对立面的内容进行复制粘贴来引用一些网站的内容,不过最近有网友在使用这个 ...

  10. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...