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