【问题标题】:Android, Instantiating Instance Variables, What Thread?Android,实例化实例变量,什么线程?
【发布时间】:2012-12-21 18:18:52
【问题描述】:

全部:

我正在研究具有与其他实例变量一起声明和实例化的处理程序的代码:

public class SomeActivity extends Activity {
    Handler handler = new Handler();  // What thread is this taking place on?
    // rest of class omitted
}

那么它是在 UI 线程上实例化的吗?我希望如此,因为它用于将 Runnable 发布到 ProgressBar,而我的理解是 ProgressBar 应该只在 UI Thread 上进行操作。

Android 文档说在 onCreate() 中创建的东西是:

应用程序的活动在应用程序的 UI 线程上运行。一次 UI 被实例化,例如在活动的 onCreate() 方法,那么与 UI 的所有交互都必须在 UI 线程中运行。”

但这发生在 onCreate() 之前。

感谢您提供任何信息,

迈克尔

【问题讨论】:

  • 在 onCreate() 之前什么都没有发生,除了类级别字段的初始化。你有一个新的 Handler(),它什么也不做。 Runnable 在哪里发布?要回答您的问题,由于 Handler 是在 Activity 的上下文中声明的,因此它的 Runnable 将在 UI 线程上运行。如果没有,并且它触及了一个视图,就会抛出一个异常。

标签: android multithreading handler android-progressbar


【解决方案1】:

那么它是在 UI 线程上实例化的吗?

是的。处理程序将存在于创建它的线程中。您正在主 / UI 线程上创建您的,因此它可以访问 UI 元素。

但这发生在 onCreate() 之前。

这不会影响 Handler 在哪个线程上运行。

【讨论】:

  • 感谢您的解释。
  • 处理程序没有很好的文档记录,但如果您对有关处理程序和 Loopers 的更长、更技术性的解释感兴趣,这是nice article
【解决方案2】:

除非您专门在后台线程上运行它,否则一切都发生在主线程(也称为 UI 线程)上。所以,是的,你的 Handler 是在 UI 线程中创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 2015-04-26
    • 2010-10-21
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多