日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 开启一个定时线程_Android 定时任务刷新的多种实现方式

發(fā)布時(shí)間:2023/12/4 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 开启一个定时线程_Android 定时任务刷新的多种实现方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。