转载请注明原文地址: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. mysql查询当前系统时间

    第一种方法:select current_date: MySQL> select current_date as Systemtime;+------------+| Systemtime |+ ...

  2. spring 深入reading

    http://wenku.baidu.com/view/8db141624a7302768e9939b3.html http://docs.spring.io/spring/docs/4.2.1.BU ...

  3. Android之文件搜索工具类

    /** * @detail 搜索sdcard文件 * @param 需要进行文件搜索的目录 * @param 过滤搜索文件类型 * */ private void search(File file, ...

  4. window.opener()方法

    <!DOCTYPE html><html><head><meta charset="GBK"><title>菜鸟教程(r ...

  5. LaTeX技巧207:使用align环境输入多行公式的技巧

    align是输入多行公式中最好用的环境,仅仅是个人浅见,因为他的对齐非常灵活,如果大家需要非常灵巧的对齐方式的多行公式,建议使用align环境,对应的也还有align*和aligned等等类似的环境, ...

  6. SIFT(Scale-invariant feature transform) & HOG(histogram of oriented gradients)

    SIFT :scale invariant feature transform HOG:histogram of oriented gradients 这两种方法都是基于图像中梯度的方向直方图的特征提 ...

  7. Visual Studio Code 配置 gcc

    作者:谭九鼎链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. Java NIO SocketChannel

    A Java NIO SocketChannel is a channel that is connected to a TCP network socket. It is Java NIO's eq ...

  9. Verilog 加法器和减法器(4)

    类似于行波进位加法器,用串联的方法也能够实现多位二进制数的减法操作.  比如下图是4位二进制减法逻辑电路图. 8位二进制减法的verilog代码如下: module subn(x, y, d,cin) ...

  10. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...