Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对长时间运行任务的最佳Android线程技术?_Android_Multithreading_Performance_Memory - Fatal编程技术网

针对长时间运行任务的最佳Android线程技术?

针对长时间运行任务的最佳Android线程技术?,android,multithreading,performance,memory,Android,Multithreading,Performance,Memory,问题是,我必须让一个线程运行相当长的时间(这是一个不确定的时间,可能是1分钟甚至数月),它需要大约每1毫秒更新一次UI 有执行器,异步任务,处理程序和本机线程类。。。但哪一个更适合这种情况 AsyncTask的问题是,在活动开始在后台运行大约一个小时后,它会被销毁(或从活动中分离),用户可以随时返回到活动,只是发现它不工作(甚至导致内存泄漏),当切换到另一个活动或甚至拉下通知面板时,UI会滞后 由于每次我需要更新UI时都会在TextView上调用post()方法(请记住,我需要大约每1毫秒报告一

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

执行器
异步任务
处理程序
和本机
线程
类。。。但哪一个更适合这种情况

AsyncTask
的问题是,在
活动开始在后台运行大约一个小时后,它会被销毁(或从
活动
中分离),用户可以随时返回到
活动
,只是发现它不工作(甚至导致内存泄漏),当切换到另一个活动或甚至拉下通知面板时,UI会滞后

由于每次我需要更新UI时都会在
TextView
上调用
post()
方法(请记住,我需要大约每1毫秒报告一次进度),因此自然线程甚至更滞后

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

你能帮帮我吗?谢谢

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

我不是安卓专家,但我猜您的异步任务被取消的原因是,作为电池供电的操作系统,操作系统决定长时间运行的后台任务对电池消耗是一件坏事

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

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

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

因此,即使你在几个月内设法以毫秒的精度测量时间,你将向用户显示的答案也会在几秒钟内出错。您将幸运地在实际运行时间的几分钟内完成


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

“大约每1毫秒更新一次UI”-您应该找到一种方法来满足这一要求。除了以这种频率处理UI输入的困难(无论您使用何种线程间通信),人类用户不可能以这种速度吸收数据。在您的情况下,最好的方法似乎是异步任务。在doInBackground()中进行后台工作,当您想发布进度时,请使用onProgressUpdate()@MartinJames计时器在while()循环中更新TextView,这就是为什么它更新得非常快,频率受loop@UmerFarooq这就是我目前正在使用的,但是系统取消了(或从活动中解除束缚)活动结束后大约一个小时左右的线程转移到后台,这就是我要避免的只是注意,确实有很多类的应用程序一直在进行这种类型的数据收集。过程控制的数据采集是一个,机器自动化是另一个,医疗监控是另一个。现在这个用户的数据可能不需要每毫秒显示和更新一次,但他们仍然需要(最终)显示数据以毫秒的精度和准确度显示。试想一下,如果你必须监测一种新型的医用起搏器,它会是什么样子?这就是那种问题!大卫说的是真的……我正在做一个像他描述的那样的项目,还有这个“秒表”就像一个测试,但那是另一个故事……问题是,它显示一个文本字符串,就像一个普通的秒表(使用ms presicion),并且它必须运行用户想要的时间(甚至几年)…@arielnmz,好吧,听起来你在尝试做一些我强烈怀疑Android不适合的事情,从功耗的角度来看。在很长一段时间内每毫秒做一次任何事情都需要一些动力。如果你有电源的话,那就好了!恐怕我对Android和计时器了解不够,但Linux有一些精确计时器功能。你可以做一些实际上是休眠而不是繁忙循环的短nanosleep()s。应用PREMPT\u RT补丁,你甚至可以