首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解UI线程

理解UI线程
EN

Stack Overflow用户
提问于 2018-03-03 05:59:06
回答 4查看 1.6K关注 0票数 3

例如,有很多任务被发布到UI线程中,如下所示。

代码语言:javascript
复制
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线程时,会发生什么情况?如果活套中没有任务,它会被暂停吗?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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取消计划的事件。

票数 2
EN

Stack Overflow用户

发布于 2018-04-11 16:01:56

我们先把几个条件弄脏吧。

处理程序

Handler允许从其他后台线程返回与UI线程的通信。这在android中很有用,因为android不允许其他线程直接与UI线程通信。从技术上讲,它是一种将消息发布或运行到相关线程消息队列的方法。

因此,总共有两个任务由处理程序执行。

  • 将消息和运行表安排为将来某个时间点执行;以及
  • 将要在与您自己的线程不同的线程上执行的操作排队。

那么如何安排一个

代码语言:javascript
复制
post(Runnable),
postAtTime(Runnable, long),
postDelayed(Runnable, Object, long),
sendEmptyMessage(int),
sendMessage(Message), 
sendMessageAtTime(Message, long),
sendMessageDelayed(Message, long).

活人:

我前面提到的Looper支持的东西,它有一个loop()方法,它一直在运行和侦听新消息,主线程一直在运行一个线程,这样您就可以从另一个线程接收消息到这个线程,如果您正在创建自己的线程,并且希望侦听,那么不要忘记在要运行循环的线程中调用prepare()。

一个简单的例子

代码语言:javascript
复制
     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()退出活套处理消息。

建议在发生方向更改或其他配置更改时,确保终止后台线程。

票数 4
EN

Stack Overflow用户

发布于 2018-04-11 15:24:46

UI线程也称为主线程,它是在打开应用程序时默认启动的线程,除非将它们卸载到其他线程,否则所有交互都会发生。它不依赖于应用程序的可见性,只要应用程序还在运行,它就会运行。它没有被系统暂停。

当活动完全加载后没有任务提交到UI线程时,会发生什么情况?如果活套中没有任务,它会被暂停吗?

让我们从活套的概念开始。这对于理解UI线程是如何工作的非常重要。Looper是一种在给定线程中循环并处理传入消息的东西,当没有任务时,它正在循环并等待新任务,因此,回答最后一个问题,线程将不会被挂起。活套被设计成即使没有任务,线程也能存活。默认情况下,Android中的UI线程有自己的活套。

当android应用程序进入后台时,这些任务会发生什么呢?即使在后台,这些任务也会被处理吗?完整的UI线程会在后台挂起吗?或?提交到UI线程的所有任务都挂起了吗?

进入后台不会改变主线程的任何内容。它在运行,直到应用程序被杀死。因此,在处理程序上调度的代码将只运行。

旁白。这里可能的问题是,当活动处于后台时,它可能会被系统杀死,并且尝试更改UI会使应用程序崩溃(有一些类似的场景),但它实际上与UI线程无关。

总之,框架在任何条件下都不会挂起UI线程。它只是运行和处理您给它的所有东西,或者等待新的任务交给它。

这里您可以在官方文档中找到主线程的描述。

是一个很好的关于活套的线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49081193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档