![](/img/trans.png)
[英]How to make a method in Android that executes every millisecond for a game?
[英]Android - Call a method every millisecond without using Threads
問題
我有一個Map<Long, String>
我需要啟動一個計時器,並且當時間(以毫秒為單位)與Map中的任何鍵匹配時,它應該將其值附加到TextView中。
我嘗試過的
我已經嘗試實現Timer和Handler ,但是由於它們都使用Threads,因此輸出會被錯誤地排列。
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (map.containsKey(elapsed)) {
textView.append(map.get(elapsed));
}
}
});
elapsed++;
}
}, 0, 1);
我需要的
一種無需使用線程即可完成任務的方法。 這里的主要問題是因為代碼必須每毫秒執行一次,線程混亂並且字符排列不正確。 有什么有效的方法可以達到預期的結果嗎?
首先-如果您希望每毫秒運行一次,請找到其他操作系統。 Android(以及Linux中的gneneral)並未針對此類操作進行優化。 您確實需要一個RTOS,以確保能夠正常工作。 Linux的sleep命令甚至不接受很小的參數,因此默認為no-op。
其次-您可能實際上並不希望它每毫秒運行一次。 幾乎可以肯定,您在估計需要完成的頻率上花費了大量精力。
第三,您正在編寫UI。 UI僅以最大速率每1/60秒更新一次。 因此,即使您以1ms的速度運行它,也不會每秒執行超過60次(約16ms)的操作。
第四-答案是線程。 非線程-單線程。 這會運行一次while循環,在兩次嘗試之間睡眠一毫秒(盡管睡眠1毫秒可能只是立即返回,或者以系統的任何計時器頻率返回,可能為16毫秒)。 但是,您不希望每個請求一個線程,而是想要一個線程周期,因此嘗試是同步發生的,並且不依賴於線程調度。
但真正的答案是,您做事的方式是錯誤的,您應該從另一個方向來對待事情。
有兩種方法可以實現此目的:
使用處理程序:使用處理程序不一定需要創建另一個線程。 您可以創建一個處理程序以使用UI線程的循環程序/消息隊列,並通過延遲所需的任何時間來繼續對其調用“ postDelayed”。
使用AlarmManager:您可以使用“ setRepeating”來安排PendingIntent重復發送。 請注意,盡管在API 19之后,AlarmManager將不會完全准確
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.