Android: 为什么没有静态方法获取主线程的Handler?
Android: Why isn't there a static method to get the main thread's Handler?
我是 Android 开发的新手。在 Android 中处理线程时似乎有 2 个重要 类:Looper
和 Handler
。有静态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()
并触发只应由系统触发的逻辑。
我是 Android 开发的新手。在 Android 中处理线程时似乎有 2 个重要 类:Looper
和 Handler
。有静态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()
并触发只应由系统触发的逻辑。