Android worker线程持续多长时间?
我看过一些关于这个问题的帖子,但没有一个有令人满意的答案 假设我在其Android worker线程持续多长时间?,android,multithreading,android-activity,worker-thread,Android,Multithreading,Android Activity,Worker Thread,我看过一些关于这个问题的帖子,但没有一个有令人满意的答案 假设我在其onCreate()方法中从主(一个也是唯一的)Activity启动一个工作线程。然后我调用finish()以终止活动 此时,它所属的任务将被销毁(因为其中不再有任何活动)。但是,应用程序(以及运行它的进程)可以继续以空的“骨架”形式存在,以便在需要时可以快速重新启动(尽管它很容易被系统杀死) 假设以上是正确的——工作线程何时被终止?是否只有在系统主动破坏进程时才会终止 在我的例子中,我的工作线程作为蓝牙连接的侦听器存在;收到后
onCreate()
方法中从主(一个也是唯一的)Activity
启动一个工作线程。然后我调用finish()
以终止活动
此时,它所属的任务将被销毁(因为其中不再有任何活动
)。但是,应用程序(以及运行它的进程)可以继续以空的“骨架”形式存在,以便在需要时可以快速重新启动(尽管它很容易被系统杀死)
假设以上是正确的——工作线程何时被终止?是否只有在系统主动破坏进程时才会终止
在我的例子中,我的工作线程作为蓝牙连接的侦听器存在;收到后,它将再次启动所需的活动
。在这种情况下,没有正在运行的组件(Activity
、Service
、ContentProvider
或BroadcastReceiver
)。在我看来,这应该是可行的,除了有什么东西正在杀死我的工作线程
我知道通过使用后台服务
,我可以做到这一点(而且不那么痛苦)。然而,我很好奇为什么这不起作用
谢谢,
BarryAndroid中有一个主线程(也称为UI)。这是应用程序使用的唯一线程,除非它通过thread.start()
,AsyncTask.execute()
等显式启动线程。所有活动、服务、广播接收器等都在该主线程上运行其所有生命周期方法。请注意,我包含了服务—服务在主线程上运行,除非它启动自己的线程(例外是IntentService
,它在自己的线程上运行)
您创建的线程将继续执行,直到Runnable
其传递的函数从其run函数返回(当然,进程也会终止)。它可以持续到创建它的活动/服务
结束后。然而,这样的线程仍然存在于组件的原始实例中,并且如果在没有大量特殊工作的情况下重新启动,则无法访问新实例的变量(请参见加载程序模式)。Android中有一个主(也称为UI)线程。这是应用程序使用的唯一线程,除非它通过thread.start()
,AsyncTask.execute()
等显式启动线程。所有活动、服务、广播接收器等都在该主线程上运行其所有生命周期方法。请注意,我包含了服务—服务在主线程上运行,除非它启动自己的线程(例外是IntentService
,它在自己的线程上运行)
您创建的线程将继续执行,直到Runnable
其传递的函数从其run函数返回(当然,进程也会终止)。它可以持续到创建它的活动/服务
结束后。但是,这样的线程仍将存在于组件的原始实例中,并且如果在没有大量特殊工作的情况下重新启动,则无法访问新实例的变量(请参见加载程序模式)。有一个很好的示例,非常详细:
进程生命周期错误的一个常见示例是广播接收器
当线程在其
方法,然后从
功能。一旦返回,系统将考虑广播接收器
不再处于活动状态,因此不再需要其托管进程
(除非其他应用程序组件在其中处于活动状态)。那么这个系统呢,
可以随时终止进程以回收内存,在这样做时,
它终止进程中运行的派生线程
简言之,如果线程有机会运行直到终止或进程提前终止,那么这确实不是很可预测的,您不应该完全依赖于任何顺序/行为
另外值得一提的是,即使您完成了()活动,也可以很容易地将其与线程一起执行,但如果它是您的最后一个/唯一一个活动,则不会改变图片有一个很好的示例,非常符合主题:
进程生命周期错误的一个常见示例是广播接收器
当线程在其
方法,然后从
功能。一旦返回,系统将考虑广播接收器
不再处于活动状态,因此不再需要其托管进程
(除非其他应用程序组件在其中处于活动状态)。那么这个系统呢,
可以随时终止进程以回收内存,在这样做时,
它终止进程中运行的派生线程
简言之,如果线程有机会运行直到终止或进程提前终止,那么这确实不是很可预测的,您不应该完全依赖于任何顺序/行为
另外值得一提的是,即使您完成了()活动,也可以很容易地将其与线程一起执行,但如果它是您的最后一个/唯一一个活动,则启动线程时不会改变图片,它独立于启动线程的父级。在您的情况下,这是您的应用程序活动。这意味着,在Run方法完全执行之前,线程将处于活动状态
如果退出应用程序(并因此调用活动的onStop方法),线程将仍然存在,并且会导致内存泄漏。如果内存不足,它最终会被系统杀死
因为您提到您创建了一个侦听器来侦听蓝牙连接,所以您的线程可能在接收到任何事件之前就死了(我不可能知道没有任何代码片段)。它还可能崩溃,从而结束线程。Wh
EventBus.getDefault().post(new BlueToothEvent()); // call in your worker thread
// do something in your service
onBlueToothEventFired(BlueToothEvent e);