Android短轮询解决方案——CountDownTimer+Handler
转载请注明原文地址: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的更多相关文章
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- http长轮询&短轮询
http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- HTTP长轮询和短轮询
http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...
- HTTP协议中的短轮询、长轮询、长连接和短连接
HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...
- 关于ajax的短轮询问题
利用前台的ajax不断向后台服务器请求,后台服务器不断查看数据库里的信息是否变化.若变化将信息返回前台,并执行一些操作 前台ajax代码 注意要加上cache这一项,如果是post请求的化,可以免了. ...
- HTTP协议中的短轮询、长轮询、长连接和短连接,看到一篇文章有感
关于短轮询.长轮询 短轮询主要是前端实现,JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询. 长轮询主要取决于服务器,在长轮询中,服务器如果检测到数据 ...
- 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
作者:伯乐在线专栏作者 - 左潇龙 http://web.jobbole.com/85541/ 如有好文章投稿,请点击 → 这里了解详情 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此 ...
- HTTP协议中的长连接、短连接、长轮询、短轮询
长连接.短连接,指的是TCP连接.长连接是为了复用TCP连接. 长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒).在这个时间里,服务器会 ...
随机推荐
- Spring Boot中使用JavaMailSender发送邮件
相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...
- 绝命毒师第五季/全集Breaking Bad迅雷下载
本季Breaking Bad Season 5(2012)看点:故事紧接着上一季,通过一场精心策划的大爆炸,沃尔特(布莱恩·科兰斯顿 Bryan Cranston 饰)终于除掉了长久以来的威胁古斯塔沃 ...
- 一步一步做出属于自己的Eclipse
本文将教大家一步一步打造属于自己的eclipse,涉及到地方,不完全之处请谅解. 一.下载 进入eclipse网站:http://www.eclipse.org/downloads/ 下载:Eclip ...
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
- npm速度过慢的解决方案
因为npm连接的数据源网站太慢,可以使用淘宝提供的npm数据源, npm config set registry https://registry.npm.taobao.org 使用NPM(Node. ...
- [转]cocos2d-x
Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...
- spring boot1.5以上版本@ConfigurationProperties取消location注解后的替代方案 cannot resolve method location
问题 在spring boot(版本1.5.1.RELEASE)项目中,当准备映射自定义的配置文件属性到类中的时候,发现原本的@ConfigurationProperties注解已将location属 ...
- 洛谷 p1352 没有上司的舞会 题解
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- 混沌分形之迭代函数系统(IFS)
IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于198 ...
- go语言之进阶篇并行和并发的区别与go语言并发优势
1.并行和并发的概念 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在 ...