安卓:为什么没有一个静态方法来获取主线程的Handler?

3

我是Android开发的新手。在处理Android的线程时,似乎有两个重要的类: LooperHandler。分别有静态方法 Looper.myLooper()Looper.getMainLooper(),用于获取当前线程的 looper 和 UI 线程的 looper。然而,Handler 没有这样的静态方法。例如,如果你想要将数据发送到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; }

2
因为 Handler 的主要目的是通过扩展 Handler 类(或实现自己的 Handler.Callback)来执行 handleMessage,所以您只能这样做。 - pskink
1
在处理Android线程时,似乎有两个重要的类:Looper和Handler。通常情况下,您会使用高阶线程方法(AsyncTask、IntentService、RxJava/RxAndroid、LiveData等)。Handler/Looper是低级别的工具,新手很少需要使用它们。 - CommonsWare
@pskink 哦。我只想发布消息,不打算处理它们。如果我在静态字段中自己缓存主处理程序,这样可以吗? - James Ko
1
所以,如果您有一个View,您可以使用View#post(当然)。如果您没有View,那么您可以简单地使用任何单例来保持您的Handler - pskink
2个回答

4

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

您可以使用您提供的代码向Looper添加Handler。

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

要将消息发布到消息队列中,您可以调用Handler.sendMessage()或类似的Handler.post(Runnable),它在内部使用消息。 sendMessage()定义在Handler上而不是例如Looper,因为通过这种方式可以将消息的目标设置为指定的Handler。因此,当Looper接收到消息时,它知道要运行哪个特定Handler的哪个handleMessage

最后,假设您有一个返回“主”处理程序的静态方法,例如系统用于处理诸如配置更改之类的事情的处理程序。这将非常危险,因为您可能会调用handleMessage()并触发仅应由系统触发的逻辑。

1
最后,假设你有一个返回“主”句柄的静态方法 - 理论上Looper可以拥有默认的Handler来用于“post”自定义的Runnable,但显然谷歌开发人员更喜欢发送Message,因此带有重写的handleMessage方法的自定义Handler是遵循的一种方式... - pskink

1
很抱歉,我的回答是否定的。
在Android中,您要实现所需功能的常见方法是使用Activity#runOnUiThread(Runnable)
此外,作为另一种从任何类中能够实现此操作的替代方法,我喜欢提供您可以在这个其他答案中看到的帮助程序。
最后,还有其他选择,例如使用RxJava(带有Android绑定)或其他库,如Kotlin的Anko。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接