首页 > 解决方案 > Android Handler 实例线程安全

问题描述

AndroidHandler类实例本身是线程安全的吗?

例如,使用下面的示例代码从多个线程发布到主线程是否安全,或者必须实例化两个处理程序(每个线程中一个)?

Handler singleHandler = new Handler(Looper.getMainLooper());

new Thread(new Runnable() {
    public void run() {
        Runnable runnable1 = new MyRunnable();
        singleHandler.postDelayed(runnable1, 100);
    }
}).start();

new Thread(new Runnable() {
    public void run() {
        Runnable runnable2 = new MyRunnable();
        singleHandler.postDelayed(runnable2, 150);
    }
}).start();

关于 SO 有一个类似的问题,但它处理消息处理的线程安全(不是发布),这略有不同android 处理程序线程安全吗?

标签: javaandroid

解决方案


是的,从任意数量的Handler实例发布threads到单个实例完全没问题。Main正如@Onik 提到的,处理程序的工作是将消息传递给提到的Looper,并且在任何给定时间只有一个MainLooper用于您的过程。因此,处理程序的单个实例将发布到该实例。为了支持答案,如果您查看,它会在内部View.Java初始化一个,并且几乎使用它来将所有消息发布到.mHandlerAttachInfoMainLooper


推荐阅读