Android计时器/秒表具有自定义UI和令人满意的性能

时间:2016-11-18 06:08:34

标签: android runnable scheduledexecutorservice chronometer

我一直在尝试创建一个在Android中计数的自定义秒表。它需要相当精确到0.1秒,并且数字示例的自定义布局和图像:DIGITS

应用程序最小化或关闭后,还需要能够在后台运行。更具体一点,在计时器开启时​​强制应用程序保持打开状态(我不知道如何实现)。

到目前为止,我已尝试使用Handler,Runnables,scheduledExecutorService和android Chronometer类。

处理程序存在性能问题,咀嚼45%> CPU使用率(我认为这是因为UI不断更新?)。我已经设法让它使用具有适度性能的scheduledExecutorService工作,但它仍然存在继续在后台或在方向更改期间的问题。

我正在尝试在HTC one M7上创建类似于默认时钟秒表的东西。它可以在后台和方向更改期间工作而不会丢失任何时间。

使用ViewPager和滑动标签布局,计时器将位于Activity中自己的片段中。

  

这是秒表的可运行

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();

                }
            });
        }
    };
}
  

在片段i中,然后初始化scheduledExecutorService

ScheduledFuture scheduledFuture;
ScheduledExecutorService scheduledExecutorService;
  

启动计时器

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

并停止

scheduledFuture.cancel(true);

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以将IntentServiceResultReciver

一起使用

答案 1 :(得分:0)

我尝试过使用Android AnimationDrawable类,但性能差不多,androidDevelopers没有很多关于它的文档,比如准确性和可能会覆盖等等。

因此我认为我的实施效率最高,在HTC one M7上最高可达10%左右,平均为7%。

虽然我不确定我在尝试时是否正确实现了动画类,如果有人确切知道它是如何工作的,那么请随时告诉我。

使用不同的初始化启动scheduledExecutorService似乎解决了后台工作。

  

之前我使用

发起了它

scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();

  

现在我用

scheduledExecutorService= Executors.newScheduledThreadPool(16);

线程池的任何其他任意数字似乎都运行正常,我还没有优化它并找到正确数量的线程来使用,但这有助于scheduledExecutorService在后台运行,因为它可以提供更多线程当活动或片段被破坏时,有些人会被摧毁。