我已经看过一些关于这个主题的帖子,但没有一个有令人满意的答案。
假设我使用Activity
方法从我的main(one-only-only)onCreate()
启动一个工作线程。然后我致电finish()
以使Activity
终止。
此时,它所属的任务被破坏(因为其中不再有Activity
)。应用程序(以及运行它的进程)可能会以空的“骨架”形式继续存在,因此如果需要可以快速重新启动(尽管它很容易被系统杀死)。
假设上述情况正确 - 工作线程什么时候被杀?只有在系统主动破坏过程时它才会被杀死吗?
就我而言,我的工作线程作为蓝牙连接的监听器存在;收到后,它会再次启动所需的Activity
。在这种情况下,没有正在运行的组件(Activity
,Service
,ContentProvider
或BroadcastReceiver
)。在我看来,这应该有效,除了某些东西正在杀死我的工作线程。
我知道我可以通过使用背景Service
来做到这一点(而且痛苦更少)。但是,我很好奇为什么这不起作用。
谢谢, 百里
答案 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模式)。