我是Android开发的新手。在Android中处理线程时似乎有两个重要的类:Looper
和Handler
。有静态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; }
答案 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。