2016-11-18 44 views
1

我一直在試圖創建一個自定義秒錶,在android計數。它需要相當精確至0.1秒,並且數字示例中使用了自定義佈局和圖像:DIGITSAndroid定時器/秒錶,自定義用戶界面和令人滿意的性能

它還需要能夠在應用程序最小化或關閉後在後臺運行。更具體地說,強制應用程序保持打開,而計時器打開(我不知道如何實現這一點)。

到目前爲止,我已經嘗試過使用Handlers,Runnables,scheduledExecutorService和android Chronometer類。

處理程序有性能方面的問題,咀嚼45%> CPU使用率(我認爲這是因爲UI不斷更新?)。我設法使用具有適度性能的scheduledExecutorService來工作,但它仍然存在在後臺或方向更改期間繼續存在的問題。

我想創建一些類似HTC一個M7的默認時鐘秒錶。它可以在後臺和方向更改期間工作,不會浪費任何時間。

計時器將在其活動中使用ViewPager和滑動標籤佈局在其自己的片段中。

這是可運行爲秒錶

public Runnable run() { 

    return new Runnable() { 
     @Override 
     public void run() { 

      centiseconds++; 
      if (centiseconds > 9) { 
       centiseconds = 0; 
       seconds++; 
      } 
      if (seconds > 59) { 
       seconds = 0; 
       minutes++; 
      } 
      if (minutes > 59) { 
       minutes = 0; 
       hours++; 
      } 

      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 

        updateCustomUI(); 

       } 
      }); 
     } 
    }; 
} 

在片段然後我初始化ScheduledExecutorService的

ScheduledFuture scheduledFuture; 
ScheduledExecutorService scheduledExecutorService; 

要啓動定時器

scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(run(), 0, 100, TimeUnit.MILLISECONDS); 

,並阻止它

scheduledFuture.cancel(true); 
+0

當顯示器關閉或您的應用程序在後臺運行時,您的代碼將失敗,因爲Android會停止它,並且您的計數代碼也會停止。使用CountDownTimer而不是您自己的二次計數代碼。 – Robert

+0

這隻會對倒計時有用嗎?我將如何執行它以計數UP? (如在秒錶中)。 –

+0

閱讀文檔,你會看到有一個'onTick()'方法可以被觸發1000毫秒。 – Robert

回答

0

在這種情況下,你可以使用IntentServiceResultReciver

+0

是的,正如我在我的問題所說,我已經嘗試使用處理程序。我發現他們的時間不夠一致,我想創造的計時器。它也不能解決應用程序暫停或停止時能夠在後臺運行的問題。或者我錯過了什麼? –

+0

我已編輯我的答案 – GreenRobo

+0

我還沒有完成意圖和廣播/結果接收器。我會學習它,並給它一個去。我會看到它在哪裏。 –

0

我已經使用了Android AnimationDrawable類嘗試,但表現得對相同和androiddevelopers沒有像它的準確性和潛力等很多文件覆蓋等。

所以我決定我的實現是最高效的,在我的HTC one M7上最高達到10%左右,平均7%。

儘管我不確定我是否正確實施了動畫類,但當我嘗試它時,如果有人確切知道它是如何工作的,請隨時告訴我。

使用不同的初始化啓動scheduledExecutorService似乎解決了後臺工作。

以前我使用

scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();

現在我用

scheduledExecutorService= Executors.newScheduledThreadPool(16); 

的線程池的任何其他任意數量的似乎只是正常工作開始,我還沒有優化它,找到合適的數字但是這有助於scheduledExecutorService在後臺運行,因爲當活動或片段被破壞時,它們可以從更多的線程中獲取線程。