java - 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 处理程序线程安全吗?
解决方案
是的,从任意数量的Handler实例发布threads
到单个实例完全没问题。Main
正如@Onik 提到的,处理程序的工作是将消息传递给提到的Looper
,并且在任何给定时间只有一个MainLooper
用于您的过程。因此,处理程序的单个实例将发布到该实例。为了支持答案,如果您查看,它会在内部View.Java
初始化一个,并且几乎使用它来将所有消息发布到.mHandler
AttachInfo
MainLooper
推荐阅读
- visual-studio-code - VS Code Extension如何调用C++动态依赖库
- python - Matplotlib 轮廓:设置颜色条的范围(不是颜色图的范围)
- ios - 如何在 Swift 中向 Data 实例添加描述
- git - 如何将功能分支合并到主分支中,以便也反映新的更改
- cookies - 获取cookie但不存储在浏览器中
- android - Android表格布局在java中添加跨越表格宽度的单列行
- math - 最小堆中插入的复杂性是多少?
- r - ncols 是栅格中的纬度还是经度?
- python-3.x - 如何将对象第一个序列化器传递给第二个序列化器,第二个序列化器到第三个序列化器和第三个到第四个
- javascript - 是否可以锁定网站上的移动键盘?