java为什么不是UI线程的线程不能访问视图?
我知道没有线程可以访问当前视图,除非它是UI线程。我想知道为什么?为什么改变视图的线程很重要?这是出于安全原因吗?这是我使用的工作环境:
public void doLayout()
{
Runnable run = new Runnable()
{
public void run()
{
ViewerActivity.setContentView(R.layout.main);
}
};
handler.post(run);
}
private Handler handler;'
每次我想改变布局的时候都这么做是一种痛苦。有不同的工作吗?我知道异步任务,但我从来没有找到一个好的方法来使用它,它比我现在做的更好吗?所有相关的答案都是正确的
# 1 楼答案
是的,你的权利是:为了安全起见,你不能在另一个线程上修改视图(这就是为什么它被称为UI线程)。它可以防止用户界面数据处于不一致的状态,这可能会导致应用程序崩溃,并且很难调试。所以android API只是禁止这样做(这是个好主意)。这是一种常见的UI模式,在大多数API中都可以找到
可以使用post()或runOnUiThread()更新任何视图:
为什么是这种模式
同步不是免费的。它会影响性能。因此,将对UI的修改保持在同一线程上更容易
如果我可以修改来自不同线程的数据,会发生什么})之前获得整个颜色
例如:线程
A
正在更改视图的颜色,而线程B
正在同时读取颜色。由于多线程不能保证先执行哪条指令,因此可能会得到意外的结果。颜色是黑色(0|0|0
),之前,线程A
想要设置白色(255|255|255
),并首先将红色组件设置为255
,线程B
开始读取,并在线程A
有机会完成并获得红色(^这是一个简单的例子,它会影响视觉效果,但如果对一些非常重要的数据发生这种情况,您的应用程序将严重崩溃,这样的错误非常严重,很难调试。关于多线程有很多需要学习的地方,也许this java tutorial是一个很好的起点
# 2 楼答案
安全性不是唯一的UI线程,也是唯一可以访问视图的线程。主要原因是视图背后的代码可能不是线程安全的。这意味着,如果有多个线程读取和写入公共变量,则无法保证数据不会被破坏
看看这个great wikipedia article about thread safety.
# 3 楼答案
Android应用程序使用Single Thread Model,该线程负责向UI元素发送各种事件。这个单线程模型有两条规则:
如果创建的线程在
UI thread
之外使用View
,那么它违反了第二条规则