Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解UI线程_Java_Android_Android Handler_Ui Thread_Android Looper - Fatal编程技术网

Java 理解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应用程序进入后台时,这些任务会发

例如,有许多任务被发布到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线程时,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
上发布
消息
(除非宿主进程被终止)<