第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Android中調(diào)度循環(huán)任務(wù)

在Android中調(diào)度循環(huán)任務(wù)

慕運(yùn)維8079593 2019-07-09 10:12:05
在Android中調(diào)度循環(huán)任務(wù)我正在設(shè)計(jì)一個(gè)應(yīng)用程序,它有一個(gè)經(jīng)常性的任務(wù),即只要應(yīng)用程序處于前臺(tái),就會(huì)將其發(fā)送到專用服務(wù)器。在我的網(wǎng)上搜索中,我看到了幾種不同的方法,并且想知道什么是最好的方法。調(diào)度服務(wù)器調(diào)用的最佳方法是什么?我看到的選擇是:定時(shí)器.ScheduledThreadPoolExecutor.服務(wù).廣播電臺(tái)AlarmManager.你的意見(jiàn)呢?編輯: 我之所以需要這個(gè),是因?yàn)橐粋€(gè)基于聊天的應(yīng)用程序,它將所有的用戶操作發(fā)送到遠(yuǎn)程服務(wù)器。即用戶正在輸入消息,用戶正在讀取消息,用戶處于聯(lián)機(jī)狀態(tài),用戶處于脫機(jī)狀態(tài)等。這意味著每隔一段時(shí)間,我就需要發(fā)送服務(wù)器我正在做的事情,因?yàn)槲液推渌舜蜷_(kāi)了一個(gè)聊天室,他們需要知道我在做什么。類似于WhatsApp消息反饋機(jī)制:編輯2: 現(xiàn)在,應(yīng)該幾乎總是通過(guò)JobSchedulerAPI(或FirebaseJobDispatcher),以防止電池耗盡問(wèn)題,如生命體征部分安卓訓(xùn)練
查看完整描述

3 回答

?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

我不確定,但據(jù)我所知,我同意我的看法。如果我錯(cuò)了,我總是接受最好的答案。

報(bào)警經(jīng)理

警報(bào)管理器保持CPU喚醒鎖,只要警報(bào)接收器的鎖onReceive()方法正在執(zhí)行。這保證了在你處理完廣播后手機(jī)不會(huì)睡覺(jué)。一次onReceive()返回時(shí),警報(bào)管理器將釋放此喚醒鎖。這意味著,在某些情況下,電話會(huì)在您的onReceive()方法完成。如果你的報(bào)警器呼叫Context.startService(),在所請(qǐng)求的服務(wù)啟動(dòng)之前,手機(jī)可能會(huì)休眠。為了防止這件事,你的BroadcastReceiverService將需要實(shí)現(xiàn)單獨(dú)的喚醒鎖定策略,以確保電話繼續(xù)運(yùn)行直到服務(wù)可用為止。

注意:警報(bào)管理器適用于您希望在特定時(shí)間運(yùn)行應(yīng)用程序代碼的情況,即使您的應(yīng)用程序當(dāng)前沒(méi)有運(yùn)行。對(duì)于正常的定時(shí)操作(滴答、超時(shí)等),使用Handler更容易,效率更高。

定時(shí)器

timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        synchronized public void run() {

            \\ here your todo;
            }

        }}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));

Timer有一些缺點(diǎn)可以通過(guò)ScheduledThreadPoolExecutor..所以這不是最好的選擇

ScheduledThreadPoolExecutor.

你可以用java.util.TimerScheduledThreadPoolExecutor(首選)在后臺(tái)線程上定期安排動(dòng)作。

下面是一個(gè)使用后者的示例:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate      (new Runnable() {
         public void run() {
            // call service
         }
      }, 0, 10, TimeUnit.MINUTES);

所以我更喜歡ScheduledExecutorService

但是也要考慮到,如果在應(yīng)用程序運(yùn)行時(shí)將發(fā)生更新,則可以使用Timer,如其他答案或較新的答案所示ScheduledThreadPoolExecutor..如果應(yīng)用程序在未運(yùn)行時(shí)仍將進(jìn)行更新,則應(yīng)使用AlarmManager.

警報(bào)管理器適用于您希望在特定時(shí)間運(yùn)行應(yīng)用程序代碼的情況,即使您的應(yīng)用程序當(dāng)前沒(méi)有運(yùn)行。

請(qǐng)注意,如果您計(jì)劃在關(guān)閉應(yīng)用程序時(shí)進(jìn)行更新,則每十分鐘更新一次是非常頻繁的,因此可能會(huì)太耗電。


查看完整回答
反對(duì) 回復(fù) 2019-07-09
?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

定時(shí)器

正如在javadocs最好使用ScheduledThreadPoolExecutor。

ScheduledThreadPoolExecutor

當(dāng)用例需要多個(gè)工作線程且睡眠間隔較小時(shí),請(qǐng)使用此類。有多?。苦?,我想大概15分鐘。這個(gè)AlarmManager此時(shí)啟動(dòng)調(diào)度間隔,這似乎表明,對(duì)于較小的睡眠間隔,可以使用該類。我沒(méi)有數(shù)據(jù)支持最后一項(xiàng)聲明。這是一種預(yù)感。

服務(wù)

VM可以隨時(shí)關(guān)閉您的服務(wù)。不要將服務(wù)用于經(jīng)常性任務(wù)。循環(huán)任務(wù)可以啟動(dòng)一項(xiàng)服務(wù),這完全是另一回事。

AlarmManager的BroadCastReciever

對(duì)于更長(zhǎng)的睡眠間隔(>15分鐘),這是方法。AlarmManager已經(jīng)有常量(AlarmManager.INTERVAL_DAY)暗示它可以在最初計(jì)劃的幾天后觸發(fā)任務(wù)。它還可以喚醒CPU來(lái)運(yùn)行代碼。

您應(yīng)該根據(jù)您的計(jì)時(shí)和工作線程需要使用這些解決方案之一。


查看完整回答
反對(duì) 回復(fù) 2019-07-09
  • 3 回答
  • 0 關(guān)注
  • 549 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)