簡體   English   中英

Android-每毫秒調用一個方法而不使用線程

[英]Android - Call a method every millisecond without using Threads

問題

我有一個Map<Long, String>

我需要啟動一個計時器,並且當時間(以毫秒為單位)與Map中的任何鍵匹配時,它應該將其值附加到TextView中。

我嘗試過的

我已經嘗試實現TimerHandler ,但是由於它們都使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM