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進行不同的后續操作(切記:跳轉前,要停止計數器),這個具體情況具體定義,我就不貼代碼了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM