例如,有很多任务被发布到UI线程中,如下所示。
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Some logic to display/update something in UI
}
}, 5000);当android应用程序进入后台时,这些任务会发生什么呢?
即使在后台,这些任务也会被处理吗?完整的UI线程会在后台挂起吗?或?提交到UI线程的所有任务都挂起了吗?
当活动完全加载后没有任务提交到UI线程时,会发生什么情况?如果活套中没有任务,它会被暂停吗?
提前谢谢。
发布于 2018-04-12 06:54:20
关于这个案子有很多答案。我将尽力准确地回答这些问题。
当android应用程序进入后台时,这些任务会发生什么呢?
一切都不会被打断。Handler将在指定的时间内在MessageQueue上发布一个Message (除非主机进程被终止)。
即使在后台,这些任务也会被处理吗?
从Handler的角度看,它不知道应用程序是在前台还是在后台。它所知道的是,它应该在某个时候发布一个Message。
完整的UI线程会在后台挂起吗?或?提交到UI线程的所有任务都挂起了吗? 当活动完全加载后没有任务提交到UI线程时,会发生什么情况?如果活套中没有任务,它会被暂停吗?
在任何情况下,UI线程都不会被“挂起”(除非主机进程被终止)。只是由于MessageQueue是空的,所以它将处于空闲状态,因此不需要做任何工作。
另外,在应用程序转到后台时,不要执行与UI相关的操作,因为视图层次结构的状态不会被正确保存。假设您一次执行了textView.setText("bob"),而应用程序处于后台。现在,这个TextView的状态不会被保存,因为onSaveInstanceState()已经被执行,并且不会再次被执行,因此如果程序的进程被杀死和重新创建(即由于系统资源短缺),那么活动将被恢复为它在调用onSaveInstanceState()时所拥有的状态。现在用户将看不到"bob“。
您可以使用Handler#removeCallbacks() API取消计划的事件。
发布于 2018-04-11 16:01:56
我们先把几个条件弄脏吧。
Handler允许从其他后台线程返回与UI线程的通信。这在android中很有用,因为android不允许其他线程直接与UI线程通信。从技术上讲,它是一种将消息发布或运行到相关线程消息队列的方法。
因此,总共有两个任务由处理程序执行。
那么如何安排一个
post(Runnable),
postAtTime(Runnable, long),
postDelayed(Runnable, Object, long),
sendEmptyMessage(int),
sendMessage(Message),
sendMessageAtTime(Message, long),
sendMessageDelayed(Message, long).我前面提到的Looper支持的东西,它有一个
loop()方法,它一直在运行和侦听新消息,主线程一直在运行一个线程,这样您就可以从另一个线程接收消息到这个线程,如果您正在创建自己的线程,并且希望侦听,那么不要忘记在要运行循环的线程中调用prepare()。
一个简单的例子
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}现在回答你的问题:
1: Things(线程和Looper和Handler)继续运行,直到用户完成或被系统杀死为止。
2: looper有一个循环()方法,它将处理队列中的每个消息,并在队列为空时阻塞。
3:如果要从后台线程更新UI,请确保app位于前台,或者终止onDestroy()中的后台线程,如果处理程序附加到主线程,则可以使用handler.getLooper().quitSafely()或handler.looper.quit()退出活套处理消息。
建议在发生方向更改或其他配置更改时,确保终止后台线程。
发布于 2018-04-11 15:24:46
UI线程也称为主线程,它是在打开应用程序时默认启动的线程,除非将它们卸载到其他线程,否则所有交互都会发生。它不依赖于应用程序的可见性,只要应用程序还在运行,它就会运行。它没有被系统暂停。
当活动完全加载后没有任务提交到UI线程时,会发生什么情况?如果活套中没有任务,它会被暂停吗?
让我们从活套的概念开始。这对于理解UI线程是如何工作的非常重要。Looper是一种在给定线程中循环并处理传入消息的东西,当没有任务时,它正在循环并等待新任务,因此,回答最后一个问题,线程将不会被挂起。活套被设计成即使没有任务,线程也能存活。默认情况下,Android中的UI线程有自己的活套。
当android应用程序进入后台时,这些任务会发生什么呢?即使在后台,这些任务也会被处理吗?完整的UI线程会在后台挂起吗?或?提交到UI线程的所有任务都挂起了吗?
进入后台不会改变主线程的任何内容。它在运行,直到应用程序被杀死。因此,在处理程序上调度的代码将只运行。
旁白。这里可能的问题是,当活动处于后台时,它可能会被系统杀死,并且尝试更改UI会使应用程序崩溃(有一些类似的场景),但它实际上与UI线程无关。
总之,框架在任何条件下都不会挂起UI线程。它只是运行和处理您给它的所有东西,或者等待新的任务交给它。
这里您可以在官方文档中找到主线程的描述。
这是一个很好的关于活套的线程。
https://stackoverflow.com/questions/49081193
复制相似问题