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

时间:2017-08-16 18:06:36

标签: android multithreading android-handler

我是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 个答案:

答案 0 :(得分:3)

每个Looper可能有多个处理程序。那么Handler会为主Looper返回哪个?

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

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

要将邮件发布到邮件队列,请调用Handler.sendMessage()或类似地Handler.post(Runnable),内部使用邮件。 sendMessage()在Handler上定义,而不是在Looper上定义,因为通过这种方式,Message的目标可以设置为指定的Handler。因此,当Looper收到消息时,它知道要运行的特定处理程序的具体handleMessage

最后,让我们假设您有一个静态方法返回" main"例如,处理程序,系统用来处理配置更改之类的处理程序。这可能非常危险,因为您可以自己调用handleMessage()并触发应该仅由系统触发的逻辑。

答案 1 :(得分:1)

快速答案是否定的,我很害怕。

在Android中执行所述操作的常用方法是使用Activity#runOnUiThread(Runnable)

此外,作为从任何课程中执行此操作的替代方法,我希望提供您在this other answer中可以看到的帮助。

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