【问题标题】:View.postDelayed why is it an instance method?View.postDelayed 为什么是实例方法?
【发布时间】:2014-05-28 11:46:24
【问题描述】:

在Android平台中,一个View对象有一个实例方法postDelayed,根据文档:

使 Runnable 被添加到消息队列中,在之后运行 经过指定的时间量。可运行文件将在 用户界面线程。

我的问题:

  1. 为什么这个方法必须是 View 的实例方法?
  2. 如果我在一个视图而不是另一个视图中调用 postDelayed 会有什么不同吗?

谢谢。

【问题讨论】:

  • 为什么你认为它不应该是视图的实例方法?实例变量有助于创建可以处理的多个对象,但使用静态你无法实现。想象一下,如果 ImageView 是静态的,那么您的应用程序中不能有多个图像持有者。
  • 假设当我从一个视图而不是另一个视图调用 postDelayed 时,它的行为完全相同,那么我认为此方法不属于任何一个特定的视图实例。它应该在某处被分解。而且因为它“导致Runnable被添加到消息队列中”,我认为它确实应该属于这个消息队列实例,比如messageQueue.postDelayed什么的。
  • 这种情况下的消息队列将是修改 UI 的队列。暂时看这个developer.android.com/reference/android/os/MessageQueue.html,明天回复你,再见
  • 您能否详细说明您的要求,以及“当我从一个视图而不是另一个视图调用它时”是什么意思
  • 我同意。把这个放在视图上感觉很奇怪。我希望至少有一个我会调用 postDelayed 的 getHandler() 方法。事实上,这个方法实际上是一个助手(ala findViewById),它只是将调用转发给它的 mAttachInfo 成员。

标签: android


【解决方案1】:

为什么这个方法必须是View的实例方法?

它在当前实现中引用了一个mAttachInfo 数据成员,然后又引用了该数据成员的mHandler,这是一个Handler,它实际上执行postDelayed() 的工作(如果mAttachInfo 不是@ 987654327@)。欢迎您在the source code 阅读所有这些内容。

如果我在一个视图而不是另一个视图中调用 postDelayed 会有所不同吗?

理论上,两个 View 实例可以与单独的 Handler 实例一起使用。但是,从记录的行为的角度来看,应该没有区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多