Android:为什么没有一个静态方法来获得主线程的处理程序?

我是Android开发的新手。 在处理Android中的线程时似乎有两个重要的类: LooperHandler 。 有静态Looper.myLooper()Looper.getMainLooper()方法分别获取当前线程的活套和UI线程的活套。 但是, 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; } 

每个Looper可能有许多处理程序 。 那么你会为主要的循环器返回哪个Handler?

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

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

要将消息发布到消息队列中,可以调用Handler.sendMessage()或类似的Handler.post(Runnable) ,它在内部使用消息。 sendMessage()在Handler上定义,而不是在Looper上定义,因为这样Message对象可以被设置为指定的Handler。 所以当Looper收到消息的时候,它就知道具体的handleMessage是什么具体的Handler来运行。

最后,我们假设你有一个返回“main”Handler的静态方法,例如系统用来处理配置改变的Handler。 这将是相当危险的,因为你可以自己调用handleMessage()并触发只能由系统触发的逻辑。

简单的回答是,我害怕。

在Android中执行所要求的常见方法是使用Activity#runOnUiThread(Runnable)

另外,作为能够从任何课程中做到这一点的另一种方式,我喜欢提供你可以在其他答案中看到的帮手。

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