问题是,我必须保持一个线程运行很长时间(它确实是一个无限期的时间,可能是1分钟甚至几个月),它需要每1毫秒更新一次UI。
有Executor
,AsyncTask
,Handler
和本地Thread
类......但哪一种更适合这种情况?
AsyncTask
的问题是它在Activity
开始在后台运行后一小时左右被销毁(或与Activity
分离?),并且用户可以返回任何时候到Activity
只是为了发现它不起作用(甚至导致内存泄漏),并且在更改到另一个活动甚至拉下通知面板时UI都会滞后。
自然线程更加滞后,因为每次我需要更新UI时post()
都会调用TextView
方法(请记住,我需要每1毫秒报告一次进度) ...
TL:博士 我正在开发一种长时间运行的秒表,可以测量从几毫秒到几天,几周甚至年。什么是最好的 UI密集型线程技术?
你能帮帮我吗?谢谢!---编辑: 解决了。它必须对系统资源和应用程序移动到后台做一些事情。我只需要保存初始时间并暂停作为捆绑包并在应用程序再次启动时加载它们。谢谢大家!
答案 0 :(得分:0)
我不是Android专家,但我猜测你的AsyncTask被取消的原因是因为操作系统是电池供电的操作系统,它决定长时间运行的后台任务对电池消耗是一件坏事。
让您的程序运行多年的后台线程对您的用户来说将是一个很大的失望,他们会想知道为什么他们的手机会在几个小时内耗尽。我建议找另一种做时间测量的方法。使用设备的实时时钟有什么问题?
我认为尝试每毫秒更新一次GUI没什么意义。操作系统无论如何都没有以该速率刷新屏幕,并且无论如何也没有人会注意到。最多每40ms一次。
然后就是准确性问题。没有必要尝试在几个小时的时间内像Android手机这样的设备上以毫秒精度测量时间,更不用说几天或几个月了。单独留下时钟和振荡器每天会错误几秒钟。最好的一个是实时时钟,但即使这样也会很差(它们总是如此)。 Android可能每天都会更新NTP几次,因此当地时钟接近准确时会有短暂的一段时间(但即便如此,也不会毫秒准确)。
因此,即使您确实设法在几个月内以毫秒精度测量时间,您将向用户显示的答案将在几秒钟内出错。你很幸运能在几分钟内完成实际的时间。
如果您的目标只是在应用程序位于前台时快速更新秒表显示,只需循环读取实时时钟并计算/显示自秒表启动以来的时间。不要在后台做任何事情,只是睡觉。当您的应用程序再次成为前台时,重新启动循当应用程序处于睡眠状态时,设备的实时时钟将一直处于打开状态,允许您计算并显示时差。这比尝试使用长时间运行的后台线程要简单得多,并且它比您选择的任何其他方式更准确(尽管仍然不是毫秒精确)。