Android工作线程持续多长时间?

时间:2016-12-31 03:23:00

标签: android multithreading android-activity worker-thread

我已经看过一些关于这个主题的帖子,但没有一个有令人满意的答案。

假设我使用Activity方法从我的main(one-only-only)onCreate()启动一个工作线程。然后我致电finish()以使Activity终止。

此时,它所属的任务被破坏(因为其中不再有Activity)。应用程序(以及运行它的进程)可能会以空的“骨架”形式继续存在,因此如果需要可以快速重新启动(尽管它很容易被系统杀死)。

假设上述情况正确 - 工作线程什么时候被杀?只有在系统主动破坏过程时它才会被杀死吗?

就我而言,我的工作线程作为蓝牙连接的监听器存在;收到后,它会再次启动所需的Activity。在这种情况下,没有正在运行的组件(ActivityServiceContentProviderBroadcastReceiver)。在我看来,这应该有效,除了某些东西正在杀死我的工作线程。

我知道我可以通过使用背景Service来做到这一点(而且痛苦更少)。但是,我很好奇为什么这不起作用。

谢谢, 百里

4 个答案:

答案 0 :(得分:1)

  

什么时候工作线程被杀?只有在系统主动破坏过程时它才会被杀死吗?

- >在执行run函数中的所有代码之后,工作线程是熟练的。即使您的activity被销毁,它仍会继续运行。

  

就我而言,我的工作线程作为蓝牙连接的监听器存在;收到后,它会再次启动所需的活动。在这种情况下,没有主动运行的组件(Activity,Service,ContentProvider或BroadcastReceiver)。在我看来,这应该有效,除了某些东西正在杀死我的工作线程。

要使其有效,在这种情况下您需要有一个背景service,并从您的工作线程或更多内容中对soft进行weak / service引用很简单,使用EventBus启动Service中的任何组件:

 EventBus.getDefault().post(new BlueToothEvent()); // call in your worker thread
// do something in your service
onBlueToothEventFired(BlueToothEvent  e);

答案 1 :(得分:0)

Android App lifecycle有一个很好的例子,主题是:

  

进程生命周期错误的一个常见示例是BroadcastReceiver   在它收到Intent时启动一个线程   BroadcastReceiver.onReceive()方法,然后从中返回   功能。一旦它返回,系统就会考虑BroadcastReceiver   不再活跃,因此不再需要其托管过程   (除非其他应用程序组件处于活动状态)。所以,系统   可以在任何时候杀死进程以回收内存,并且这样做,   它终止了在该过程中运行的衍生线程。

简而言之,如果你的线程有机会运行直到终止或进程将被预先杀死,那么它真的不是很容易预测,你不应该完全依赖任何命令/行为。

值得一提的是,即使你完成()它也很容易leak你的活动和线程,但如果你的最后/唯一的活动它不会改变图片

答案 2 :(得分:0)

启动线程时,它独立于启动它的父级。在您的情况下,这是您的应用程序活动。这意味着在完全执行Run方法之前,您的线程将处于活动状态。

如果退出应用程序(因此调用活动的onStop方法),该线程仍然存在,并且会导致内存泄漏。如果你的内存不足,它最终会被系统杀死。

由于您提到您创建了一个侦听器以侦听蓝牙连接,因此您的线程可能会在收到任何事件之前死亡(我不可能在没有任何代码片段的情况下知道)。它也可能崩溃,这将结束线程。

答案 3 :(得分:-1)

Android中有一个主要(也称为UI)线程。这是您的应用程序使用的唯一线程,除非它通过procedure TForm1.Button1Click(Sender_TObject); begin jvAlarms1.Add.Name :=Edit1.Text; jvAlarms1.Add.Time := dxDateTimeWheelPicker1.DateTime; label1.caption:=datetimetostr(dxDateTimeWheelPicker1.DateTime); jvAlarms1.Active:=True; end; Thread.start()等显式启动。所有活动,服务,BroadcastReceivers等在该主线程上运行所有生命周期方法。注意我包含了Services-一个服务在主线程上运行,除非它启动它自己的Thread(例外是AsyncTask.execute(),它确实在它自己的Thread上运行。)

您创建的IntentService会一直持续到其传递的Thread从其运行函数返回(或者当然该过程终止)。这可以超过它创建的Runnable的结尾。但是,这样的线程仍然存在于组件的原始实例中,并且如果重新启动一个新实例而没有大量特殊工作,则无法访问新实例的变量(参见Loader模式)。