Java 理解UI线程
例如,有许多任务被发布到UI线程,如下所示Java 理解UI线程,java,android,android-handler,ui-thread,android-looper,Java,Android,Android Handler,Ui Thread,Android Looper,例如,有许多任务被发布到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应用程序进入后台时,这些任务会发
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线程时,UI线程会发生什么情况?如果活套中没有任务,它会被暂停吗
提前感谢。UI线程也称为主线程,它是在打开应用程序时默认启动的线程,所有交互都发生在这里,除非您将它们卸载到其他线程。它不依赖于应用程序的可见性,只要应用程序存在,它就会一直运行。它没有被系统暂停 当活动完全加载后没有任务发布到UI线程时,UI线程会发生什么情况?如果活套中没有任务,它会被暂停吗 让我们从活套概念开始。这对于理解UI线程是如何工作的非常重要。Looper是一种在给定线程中循环并处理传入消息的东西,当没有任务时,它会循环并等待新任务,因此,在回答最后一个问题时,线程不会被挂起。Looper的设计目的是在没有任务的情况下保持线程的活动状态。Android中的UI线程默认有自己的循环器 当android应用程序进入后台时,这些任务会发生什么变化? 这些任务会在后台处理吗?整个UI线程是否会在后台挂起?或发布到UI线程的所有任务都已挂起 转到后台不会更改主线程的任何内容。它一直在运行,直到应用程序被终止。因此,在处理程序上调度的代码将只运行 旁注。这里可能存在的问题是,当活动在后台时,它可能会被系统杀死,而您尝试更改它的UI时,它将使应用程序崩溃(有一些类似的场景),但它与UI线程并不真正相关 总之,UI线程在任何情况下都不会被框架挂起。它只是运行和处理您提供给它的所有内容,或者等待新任务提供给它 您可以在官方文档中找到主线程的描述
是关于活套的一个很好的SO线程。让我们先用几个术语把它弄脏 : 处理程序允许从其他线程与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:事物(线程等循环器和处理程序)一直运行,直到用户完成或系统终止
2:循环器有一个loop()方法,该方法将处理队列中的每条消息,并在队列为空时阻塞
3:如果从后台线程更新UI,请确保应用程序位于前台或终止onDestroy()中的后台线程。如果处理程序连接到主线程,则可以使用handler.getLooper().quitsafety()
或handler.looper.quit()
退出循环器处理消息
建议在方向更改或其他配置更改的情况下,确保终止后台线程
当android应用程序运行时,这些任务会发生什么变化
背景
它将按预期工作,不会改变UI更改的行为。唯一的问题是我们看不到这些变化
最佳解决方案:
当应用程序处于后台时,更新处理程序中的任何视图
例如:TextView并在其中设置一些文本,一旦应用程序进入前台,就获得这个TextView值
这些任务会在后台处理吗?会
是否在后台挂起完整的UI线程?或所有任务
发布到UI的线程是否挂起
正如我上面提到的,这项任务将按原样工作
当您移动到后台时,应用程序不会更改UI线程,它将保持原样。
当用户界面线程没有任务发布到它之后会发生什么
活动已完全加载?如果有,它会被暂停吗
活套中没有任务
简单地说,有循环线程,例如UI线程。这样的线程有自己的循环器,它为线程运行消息循环。消息队列完成后,它将自身完成
UI线程本身不会以任何代价挂起,除非您编写一些代码来更改它:)
读起来不错:
关于这个案子有很多答案。我会尽量准确地回答这些问题 当android应用程序进入后台时,这些任务会发生什么变化 没有任何事情被打断
Handler
将在指定时间在MessageQueue
上发布消息
(除非宿主进程被终止)<