Android: 为什么没有静态方法获取主线程的Handler?

Android: Why isn't there a static method to get the main thread's Handler?

我是 Android 开发的新手。在 Android 中处理线程时似乎有 2 个重要 类:LooperHandler。有静态Looper.myLooper()Looper.getMainLooper()方法分别获取当前线程的looper和UI线程的looper。但是,Handler 没有这样的静态方法。例如,如果你想 post 到 UI 线程,代码示例建议这样做:

new Handler(Looper.getMainLooper()).post(new Runnable() { ...

为什么 Handler 不公开缓存的静态 getMainHandler() 方法,如下所示?这不是避免产生不必要的垃圾吗?

private static final Handler mainHandler = new Handler(Looper.getMainLooper());

public static Handler getMainHandler() { return mainHandler; }

恐怕快速回答是否定的。

完成您在 Android 中的要求的常用方法是使用 Activity#runOnUiThread(Runnable)

此外,作为能够从任何 class 执行此操作的替代方法,我想提供您可以在 .

中看到的帮助程序

最后,还有其他选择,例如使用 RxJava(具有 Android 绑定)或其他库,例如 Anko for Kotlin。

每个 Looper 可能有多个 Handlers。那么你会 return 哪个 Handler 作为主 Looper?

您可以使用您提供的代码将处理程序添加到 Looper。

responsibility of a Looper是从关联的消息队列中拉取消息,找到消息的目标处理程序,并将消息分派给它。处理程序将接收消息并在指定自定义消息处理逻辑的地方执行其 handleMessage(Message) 回调。

要post 向消息队列发送消息,您调用Handler.sendMessage() 或类似地调用Handler.post(Runnable),它在内部使用消息。 sendMessage() 是在 Handler 上定义的,而不是 Looper,因为这样可以将 Message 的目标设置为指定的 Handler。因此,当Looper收到消息时,它知道具体handleMessage什么具体的Handler要运行.

最后,假设您有一个 return 是 "main" 处理程序的静态方法,例如,系统用来处理配置更改等事情的处理程序。这将非常危险,因为您可以自己调用 handleMessage() 并触发只应由系统触发的逻辑。