1. 程式人生 > >Android短輪詢解決方案——CountDownTimer+Handler

Android短輪詢解決方案——CountDownTimer+Handler

receiver font 網上 adc 開始 success 方法 www 請求

轉載請註明原文地址: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