【问题标题】:Android Timer/Stopwatch with custom UI and satisfactory performance具有自定义 UI 和令人满意的性能的 Android 计时器/秒表
【发布时间】:2016-11-18 06:08:34
【问题描述】:

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

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

到目前为止,我已经尝试过使用 Handlers、Runnables、scheduledExecutorService 和 android Chronometer 类。

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

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

计时器将在使用 ViewPager 和滑动选项卡布局的 Activity 中位于其自己的 Fragment 中。

这是秒表的可运行文件

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

                }
            });
        }
    };
}

然后在片段中初始化 scheduleExecutorService

ScheduledFuture scheduledFuture;
ScheduledExecutorService scheduledExecutorService;

启动计时器

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

然后停止它

scheduledFuture.cancel(true);

【问题讨论】:

  • 当显示屏关闭或您的应用程序在后台运行时,您的代码将失败,因为 Android 会停止它并且您的计数代码也会停止。使用 CountDownTimer 而不是您自己的秒计数代码。
  • 那只会对倒计时有用吧?我将如何实现它来计数? (就像在秒表中一样)。
  • 阅读文档然后你会看到有一个onTick() 方法可以每1000毫秒触发一次。

标签: android runnable scheduledexecutorservice chronometer


【解决方案1】:

在这种情况下,您可以使用 IntentServiceResultReciver

【讨论】:

  • 是的,正如我在问题中所说,我已经尝试过使用处理程序。我发现他们的时间对于我想要创建的计时器来说不够一致。它也不能解决在应用程序暂停或停止时能够在后台运行的问题。还是我错过了什么?
  • 我已经编辑了我的答案
  • 我还没有仔细研究意图和广播/结果接收器。我会学习并试一试。我会看看它会把我带到哪里。
  • 它永远不会得到你。你必须去拿它。是什么阻止你?对我来说,我在学习的时候从来没有得到它,我是自学的。你也可以这样做。
【解决方案2】:

我曾尝试使用 Android AnimationDrawable 类,但性能大致相同,并且 androidDevelopers 没有很多关于它的文档,例如准确性和覆盖潜力等。

所以我认为我的实施是最有效的,在我的 HTC one M7 上最高可以达到 10% 左右,平均为 7%。

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

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

之前我使用过

scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();

现在我用

scheduledExecutorService= Executors.newScheduledThreadPool(16);

线程池的任何其他任意数字似乎都可以正常工作,我尚未对其进行优化并找到要使用的正确线程数,但这有助于 scheduleExecutorService 通过拥有更多可以拉动的线程在后台运行当 Activity 或 Fragment 被破坏时,是否应该有一些被破坏。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多