#使用的情景:
? ? ?App有測量功能校读,測量后把數(shù)據(jù)保存到Sqlite里再登,要實(shí)現(xiàn)把測量的數(shù)據(jù)上傳到服務(wù)器耕陷。一般有兩種處理方式:1. 用戶點(diǎn)擊按鈕后谜慌,實(shí)現(xiàn)數(shù)據(jù)上傳到服務(wù)器 ? 2. 實(shí)現(xiàn)自動上傳數(shù)據(jù)到服務(wù)器字旭。
#效果
只要在連網(wǎng)了的情況下对湃,每隔五秒就會去查詢數(shù)據(jù),看是否有新的數(shù)據(jù)遗淳,如果有就會把數(shù)據(jù)查詢出來拍柒,轉(zhuǎn)成Json上傳到服務(wù)器。
#代碼
PollingUtils啟動和關(guān)閉定時任務(wù)屈暗。
-------------------------------------------------------------------------------------------
Service開啟服務(wù)拆讯,在服務(wù)里面的線程執(zhí)行你需要的邏輯。
-------------------------------------------------------------------------------------------
在合適的地方啟動定時任務(wù)养叛。這里有四個參數(shù):第一個參數(shù)---上下文种呐,第二個參數(shù)---設(shè)置時間間隔,第三個參數(shù)---執(zhí)行任務(wù)的服務(wù)弃甥,第四個參數(shù)---服務(wù)的Aciton(標(biāo)志)爽室。
#實(shí)現(xiàn)步驟:
1.在MainActivity啟動:
PollingUtils.startPollingService(this,5,PollingService.class,PollingService.ACTION);
2.PollingUtils工具類:
public classPollingUtils {
private staticAlarmManageralarmManager;
//開啟輪詢服務(wù)
public static voidstartPollingService(Context context, intseconds,Class cls,String action) {
LogUtils.i("PollingUtils","==Start polling service...");
//獲取AlarmManager系統(tǒng)服務(wù)
alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//需要執(zhí)行Service的Intent
Intent intent =newIntent(context,cls);
intent.setAction(action);
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//觸發(fā)服務(wù)的起始時間
longtriggerAtTime = SystemClock.elapsedRealtime();
//使用AlarmManger的setRepeating方法設(shè)置定期執(zhí)行的時間間隔(seconds秒)和需要執(zhí)行的Service
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,triggerAtTime,seconds *1000,pendingIntent);
}
//停止輪詢服務(wù)
public static voidstopPollingService(Context context,Class cls,String action) {
LogUtils.i("PollingUtils","==Stop polling service...");
alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent =newIntent(context,cls);
intent.setAction(action);
PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//取消正在執(zhí)行的服務(wù)
alarmManager.cancel(pendingIntent);
}
}
3.服務(wù)PollingService
public classPollingServiceextendsService {
?public static finalStringACTION="com.hbxz.qkys.protocol.PollingService";
?privateGsonmGson;
privateStringmMachineNo;
@Override
publicIBinderonBind(Intent intent) {
return null;
}
@Override
public voidonCreate() {
if(mGson==null) {
mGson=newGson();
}
}
@Override
public voidonStart(Intent intent, intstartId) {
mMachineNo= (String) SharedPreferencesHelper.getData( UIUtils.getContext(),"MachineNo",SerialPortComm.MACHINENO);
newPollingThread().start();
}
intcount=0;//作為上傳數(shù)據(jù)是否正在運(yùn)行的標(biāo)志,1代表正在執(zhí)行
classPollingThreadextendsThread {
@Override
public void run() {
BaseApplication app = (BaseApplication) UIUtils.getContext();
//1.如果上傳數(shù)據(jù)沒正在運(yùn)行,就要開啟;
//2.如果已經(jīng)執(zhí)行,就不要開啟.
if(app.isConnectWifi&&count==0) {//Wifi開啟和count=0就執(zhí)行.
count++;//此時count就大于0了.
try{
queryDataTotal();
}catch(Exception e) {
count=0;//出錯的情況
e.printStackTrace();
}
}
}
}
}