【问题标题】:How does Android perform callbacks on my thread?Android 如何在我的线程上执行回调?
【发布时间】:2012-06-16 18:54:27
【问题描述】:

我看到类似的问题,但答案各不相同,并不统一。

考虑一个 MediaPlayer 和一个注册的监听器(例如完成 播放或 onPrepared 等)。我测试了它,回调是 在与开始播放的线程相同的线程上执行。 由于我的应用是一个游戏,这个线程不是 UI 线程,它是 游戏的线程(顺便说一句,没有任何处理程序)。

是否可以保证何时调用它?我的游戏线程 一直在运行,所以我真的无法想象如何以及用什么 限制(如果有)我的回调被系统调用。我的游戏 线程一直在工作,因此必须在 操作中间(?) - 但后来我不明白。

【问题讨论】:

  • 这是不可能的。如果回调代码的执行是“异步”发生的,那么回调一定是由另一个线程调用的。线程不能被调用,它们只能被发送信号。如果线程希望在信号上运行一些“回调”代码,它必须等待信号,例如。 Windows APC 调用 - 线程必须在其消息队列中等待以检索排队的回调,以便它可以使用自己的上下文执行它
  • 检查 Android 源代码,MediaPlayer 似乎有一个循环器和一个关联的处理程序。 (这正是您所描述的实现,即消息队列。)但我不知道我的游戏线程何时处理消息,即它何时调用其中的 handleMessage (因为我没有明确地这样做,Android系统会这样做,但我想知道何时)。

标签: java android multithreading callback


【解决方案1】:

经过更多测试,并将线程名称记录到正确的位置后,我得到了答案。

如果您的线程(创建 MediaPlayer)不是 Looper,那么 Android 显然无法向其发送消息。所以它会从你的 UI 线程调用这些回调(通过消息队列机制,正如 Martin James 所说的那样)。我的测试证实了这一点,而且它在概念上也是正确的(因为它符合 Android 架构的 Looper 概念)。

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多