Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Android 8.0 Oreo_Background Thread - Fatal编程技术网

如果我在后台无限期地运行Android线程会发生什么

如果我在后台无限期地运行Android线程会发生什么,android,multithreading,android-8.0-oreo,background-thread,Android,Multithreading,Android 8.0 Oreo,Background Thread,Android文档表明Oreo对后台执行有新的限制:。这似乎是合理的,他们的目标显然是让自己的平台更像iOS,并防止应用程序在后台泛滥 我不清楚的是(事实上,根本没有文档记录)当UI进入后台时,你可以在线程上做什么。具体来说, 假设我创建了一个线程 然后我将应用程序发送到后台 那么…那条线怎么了 我已经创建了非常简单的代码来实现这一点,我的线程已经很高兴地在logcat上运行了10多分钟,没有任何问题 有没有人对这些线程有什么限制有任何明确的信息?我会想,既然Android限制了后台服务的功能,

Android文档表明Oreo对后台执行有新的限制:。这似乎是合理的,他们的目标显然是让自己的平台更像iOS,并防止应用程序在后台泛滥

我不清楚的是(事实上,根本没有文档记录)当UI进入后台时,你可以在线程上做什么。具体来说,

假设我创建了一个线程

然后我将应用程序发送到后台

那么…那条线怎么了

我已经创建了非常简单的代码来实现这一点,我的线程已经很高兴地在logcat上运行了10多分钟,没有任何问题

有没有人对这些线程有什么限制有任何明确的信息?我会想,既然Android限制了后台服务的功能,那么它也会限制这些线程的功能

请注意,我们没有计划编写这样的应用程序。我们只是希望能够编写安全的代码,而不会在新版本的android上产生问题。在iOS上,如果你进入后台,你会得到一段宽限期来完成你正在做的任何事情(你可以要求更多的时间),但最终你的线程将被挂起

有没有人清楚地知道有哪些限制 在这样的线程上?我会认为自从Android限制 后台服务可以做什么,它也会限制这样做 线程也可以

这类线程的运行时间没有限制。只要你的应用程序在后台运行,你就可以继续在后台执行线程


但是,您需要考虑如何优雅地终止/释放线程,因为线程不会无限运行。如果操作系统需要在内存紧缩期间释放内存,那么承载此后台活动的应用程序进程将终止,最终破坏线程。如果处理不当,这将导致线程/内存泄漏。

只要在应用程序位于前台时启动线程,当应用程序转到后台时,线程可能(我的意思是可能)继续运行

但是,如果手机内存不足,并且系统决定回收内存,则线程将被终止。这很容易在低端设备上频繁发生。你需要看看Android GO

备选方案
无论如何,您可以利用作业调度器或新的改进的WorkManager来实现与运行线程相同的功能。由于JobScheduler和WorkManager由Android系统管理,因此可以保证您的功能在不受系统限制的情况下继续工作。此外,在使用JobScheduler/WorkManager时,您可以指定网络/电池等内容。这是在使用线程时无法得到的。

正如@Sagar的回答所述,虽然系统可能会选择性地终止“后台服务”,但它不会选择性地终止单个“后台线程”

但你的问题不仅仅是避免终止合同;您希望线程能够连续执行。这一页上的其他答案没有提到,在这方面有一些误导性的评论,所以我将在这里讨论

我们正在处理两个独立的问题:应用程序终止和设备睡眠

应用程序终止:Android终止应用程序以释放资源——首选后台应用程序(例如,不在屏幕上的应用程序,以及不包含应用程序的应用程序)。当应用程序终止时,其所有线程也将终止

设备睡眠:当设备进入睡眠状态时,Android会暂停你的线程,因为它会暂停所有线程。这就是为什么在移动设备上实现如此多的电池节约:CPU进入低功耗“待机”模式,并停止执行指令。即使设备可能处于睡眠状态,您的应用程序(及其线程)仍然存在

  • 使用前台服务阻止你的应用在离开屏幕后被终止
  • 使用
    WakeLock
    (部分唤醒锁定)将CPU保持在可执行的状态,即使屏幕可能已关闭
拥有前台服务不会阻止设备进入睡眠状态。同样,持有WakeLock不会阻止你的应用程序被终止。请注意。有关处理此问题的一种方法,请参阅

拥有前台服务并不保证代码的执行速度会比使用后台服务快。前台服务不会“终止”打瞌睡


如果您的日志持续打印10分钟,我认为可能是因为您的设备已插入。在大多数Android设备上,CPU在插入时保持清醒(即使屏幕可能已关闭)。

根据我在emulator API 26和27上的测试,只要应用程序仍在后台且未终止,且系统不决定终止线程或终止应用程序,启动的线程将继续工作

我甚至用以下方法强迫模拟器深度打盹:

$ adb shell dumpsys deviceidle force-idle
然而,线程仍然在运行但是,这不会发生在真正的物理设备上。线程在进入doze时暂停。因此根据经验,不要完全信任模拟器

所以,正如你在问题中提到的,你的观察结果是正常的

关于这一点:

有没有人清楚地知道有哪些限制 在这样的线程上?我会认为自从Android限制 后台服务可以做什么,它也会限制这样做 线程也可以

嗯,当涉及到消耗内存和电池时,线程本身总是比服务更令人担忧。在棉花糖出现之前,服务可以永远保持工作
$ adb shell dumpsys deviceidle force-idle