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

來源:互聯網
上載者:User

標籤:roi   跳轉   over   tle   ide   eof   exce   ==   trace   

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.