2

问题是,我必须让一个线程运行很长时间(这实际上是一个不确定的时间,可能是 1 分钟甚至几个月),并且它需要大约每 1 毫秒更新一次 UI...

Executor, AsyncTask,Handler和 nativeThread类...但是哪个更适合这种情况?

问题AsyncTask在于它在开始在后台运行Activity一小时左右后被销毁(或与),并且在切换到另一个活动甚至拉下通知面板时 UI 会滞后。ActivityActivity

由于每次我需要更新 UI 时都会post()调用该方法,自然线程更加滞后(请记住,我需要每 1 毫秒报告一次进度)......TextView

tl:dr 我正在开发一种长时间运行的秒表,可以测量从毫秒到几天、几周甚至几年的时间。最好的UI 密集型线程技术是什么?

请你帮助我好吗?谢谢!!

--- 编辑:已解决。它必须对系统资源和应用程序移动到后台做一些事情。我只需要保存初始时间并作为一个包暂停并在应用程序再次启动时加载它们。谢谢大家!

4

1 回答 1

0

我不是 Android 专家,但我猜您的 AsyncTask 被取消的原因是因为操作系统是电池供电的操作系统,它决定长时间运行的后台任务对电池消耗不利。

让您的程序运行多年的后台线程对于您的用户来说将是一个很大的失望,他们会想知道为什么他们的手机会在几个小时内耗尽电量。我建议找到另一种方法来测量时间。使用设备的实时时钟有什么问题?

我认为尝试每毫秒更新一次 GUI 没什么意义。无论如何,操作系统都不会以这种速度刷新屏幕,而且地球上没有用户会注意到。最多每40ms丰满一次。

然后是准确性问题。尝试在 Android 手机等设备上以毫秒精度测量时间是没有意义的,时间跨度为数小时,更不用说数天或数月了。不理会时钟和振荡器每天会出错几秒钟。最好的将是实时时钟,但即使这样也会很差(他们总是如此)。Android 可能会每天更新几次 NTP,因此一天中会有短暂的时间段本地时钟接近准确(但即使那样也不会精确到毫秒)。

因此,即使您确实设法在几个月内以毫秒精度测量时间,您将向用户显示的答案也会有几秒钟的误差。你会很幸运能在实际经过的时间的几分钟内得到。

如果您的目标只是在应用程序处于前台时让秒表显示快速更新,只需循环读取实时时钟并计算/显示自秒表启动以来的时间。不要在后台做任何事情,只是睡觉。当您的应用再次成为前台时,恢复循环;设备的实时时钟将在您的应用程序处于睡眠状态时一直滴答作响,让您可以计算和显示时差。这将比尝试拥有一个长时间运行的后台线程简单得多,而且它也比您可能选择的任何其他方式更准确(尽管仍然不是毫秒精度)。

于 2013-07-28T06:25:22.303 回答