android 开启一个定时线程_Android 定时任务刷新的多种实现方式
1.采用Handle與線程的sleep(long)方法
1) 定義一個(gè)Handler類,用于處理接受到的Message。
Handler handler = new Handler() {
public void handleMessage(Message msg) {
// 要做的事情
super.handleMessage(msg);
}
};
2) 新建一個(gè)實(shí)現(xiàn)Runnable接口的線程類,如下:
public class MyThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);// 線程暫停10秒,單位毫秒
Message message = new Message();
message.what = 1;
handler.sendMessage(message);// 發(fā)送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3) 在需要啟動線程的地方加入下面語句:
new Thread(new MyThread()).start();
分析:純正的java原生實(shí)現(xiàn),在sleep結(jié)束后,并不能保證競爭到cpu資源,這也就導(dǎo)致了時(shí)間上必定>=10000的精度問題。
2.采用Handler的postDelayed(Runnable, long)方法
1)定義一個(gè)Handler類
Handler handler=new Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
1
2
3
4
5
6
7
8
9
10
11
2) 啟動與關(guān)閉計(jì)時(shí)器
handler.postDelayed(runnable, 2000);//每兩秒執(zhí)行一次runnable.
1
handler.removeCallbacks(runnable);
1
分析:嗯,看起蠻不錯(cuò),實(shí)現(xiàn)上也簡單了,和sleep想必還不會產(chǎn)生阻塞,注意等待和間隔的區(qū)別。
3.采用Handler與timer及TimerTask結(jié)合的方法
1) 定義定時(shí)器、定時(shí)器任務(wù)及Handler句柄
private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
// 要做的事情
super.handleMessage(msg);
}
};
1
2
3
4
5
6
7
8
9
10
11
2) 初始化計(jì)時(shí)器任務(wù)
task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
1
2
3
4
5
6
7
8
9
3) 啟動和關(guān)閉定時(shí)器
timer.schedule(task, 2000, 3000);
1
timer.cancel();
1
此外,Timer也可以配合runOnUiThread實(shí)現(xiàn),如下
private TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//處理延時(shí)任務(wù)
}
});
}
};
1
2
3
4
5
6
7
8
9
10
11
12
分析:timer.schedule(task, 2000, 3000);意思是在2秒后執(zhí)行第一次,之后每3000秒在執(zhí)行一次。timer不保證精確度且在無法喚醒cpu,不適合后臺任務(wù)的定時(shí)。
采用AlarmManger實(shí)現(xiàn)長期精確的定時(shí)任務(wù)
AlarmManager的常用方法有三個(gè):
set(int type,long startTime,PendingIntent pi);//一次性
setExact(int type, long triggerAtMillis, PendingIntent operation)//一次性的精確版
setRepeating(int type,long startTime,long intervalTime,PendingIntent
pi);//精確重復(fù)
setInexactRepeating(int type,long startTime,long
intervalTime,PendingIntent pi);//非精確,降低功耗
type表示鬧鐘類型,startTime表示鬧鐘第一次執(zhí)行時(shí)間,long intervalTime表示間隔時(shí)間,PendingIntent表示鬧鐘響應(yīng)動作
對以上各個(gè)參數(shù)的詳細(xì)解釋
鬧鐘的類型:
AlarmManager.ELAPSED_REALTIME:休眠后停止,相對開機(jī)時(shí)間
AlarmManager.ELAPSED_REALTIME_WAKEUP:休眠狀態(tài)仍可喚醒cpu繼續(xù)工作,相對開機(jī)時(shí)間
AlarmManager.RTC:同1,但時(shí)間相對于絕對時(shí)間
AlarmManager.RTC_WAKEUP:同2,但時(shí)間相對于絕對時(shí)間
AlarmManager.POWER_OFF_WAKEUP:關(guān)機(jī)后依舊可用,相對于絕對時(shí)間
絕對時(shí)間:1970 年 1月 1 日 0 點(diǎn)
startTime:
鬧鐘的第一次執(zhí)行時(shí)間,以毫秒為單位,一般使用當(dāng)前時(shí)間。
SystemClock.elapsedRealtime():系統(tǒng)開機(jī)至今所經(jīng)歷時(shí)間的毫秒數(shù)
System.currentTimeMillis():1970 年 1 月 1 日 0 點(diǎn)至今所經(jīng)歷時(shí)間的毫秒數(shù)
intervalTime:執(zhí)行時(shí)間間隔。
PendingIntent :
PendingIntent用于描述Intent及其最終的行為.,這里用于獲取定時(shí)任務(wù)的執(zhí)行動作。
詳細(xì)參考譯文:PendingIntent
利用AlarmManger+Service+BarocastReceiver實(shí)現(xiàn)5s一次打印操作
服務(wù)類:
public class HorizonService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d("TAG", "打印時(shí)間: " + new Date().
toString());
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int five = 5000; // 這是5s
long triggerAtTime = SystemClock.elapsedRealtime() + five;
Intent i = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
廣播接受器
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, HorizonService.class);
context.startService(i);
}
}
1
2
3
4
5
6
7
啟動定時(shí)任務(wù):
Intent intent = new Intent(this,HorizonService.class);
startService(intent);
總結(jié)
以上是生活随笔為你收集整理的android 开启一个定时线程_Android 定时任务刷新的多种实现方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为畅享 70 真机曝光:高端设计大众化
- 下一篇: android 弹窗有边框_Androi