Android:为什么没有一个静态方法来获得主线程的处理程序?
我是Android开发的新手。 在处理Android中的线程时似乎有两个重要的类: Looper
和Handler
。 有静态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。