輪詢應用場景
Android中涉及到將服務器中數(shù)據(jù)變化信息通知用戶一般有兩種辦法,推送和輪詢。
譬如有這樣一個app,實時性要求不高,每天只要能獲取10次最新數(shù)據(jù)就能滿足
要求了,這種情況顯然輪詢更適合一些,推送顯得太浪費,而且更耗電。
1 界面相關的輪詢請求
實現(xiàn)步驟
1 在初始化界面時或者在某個方法內(nèi)創(chuàng)建Timer類
2 定義一個類繼成TimerTask,在創(chuàng)建Timer類的地方進行創(chuàng)建對象
3 調用timer.schedule(task, 1 * 1000, 1 * 1000); 方法進行設置輪詢的間隔時間
這三個參數(shù):1 我們第2 步定義TimerTask類,2 表示的意思是我們需要多長時間
執(zhí)行我們的TimerTask類中run方法,3 設置輪詢間隔的時間
代碼如下:
這是啟動輪尋的代碼
timer = new Timer();
task = new Task();
//schedule 計劃安排,時間表
timer.schedule(task, 1 * 1000, 1 * 1000);
………………………………………………
/**
* TimerTask對象,主要用于定時拉去服務器信息
*/
public class Task extends TimerTask {
@Override
public void run() {
Log.e("AAA", "開始執(zhí)行執(zhí)行timer定時任務...");
handler.post(new Runnable() {
@Override
public void run() {
getData();
}
});
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (timer != null) {
timer.cancel();
timer = null;
}
if (task != null) {
task.cancel();
task = null;
}
}
總結:自己項目中進行網(wǎng)絡請求的輪詢,判斷押金是否是繳納成功,如果是繳納
成功,我們就進行打印小票,為了避免無限制的打印,定義一個boolean值的變
量,初始值是true,當進行打印操作時,我們把其變成false,在輪詢時通過其值
handler.post()是在run()方法中能直接進行跟新ui的,原因是(網(wǎng)址:http://blog.csdn.net/ly502541243/article/details/52062179/)
關鍵的一句話是:直接調用線程的run()方法相當于一個普通的類調用一個方法,還是在當前線程執(zhí)行,并不會創(chuàng)建一個新線程。
進行判斷是否是需要停止輪詢,代碼如下;
if (status.equals("1")) {
//判斷如果是已經(jīng)打印就不發(fā)送請求
if (yesOrNoPrinte == false) {
if (timer != null) {
timer.cancel();
timer = null;
}
if (task != null) {
task.cancel();
task = null;
}
}
if (yesOrNoPrinte) {
//我們就進行打印,如果是0就不用管,是否打印成員變量變成false
PrinterRentTicket();
yesOrNoPrinte = false;
}
}