有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么不是UI线程的线程不能访问视图?

我知道没有线程可以访问当前视图,除非它是UI线程。我想知道为什么?为什么改变视图的线程很重要?这是出于安全原因吗?这是我使用的工作环境:

        public void doLayout()
        {
            Runnable run = new Runnable()
            {
                public void run()
                {
                    ViewerActivity.setContentView(R.layout.main);
                }
            };

            handler.post(run);
        }

        private Handler handler;'

每次我想改变布局的时候都这么做是一种痛苦。有不同的工作吗?我知道异步任务,但我从来没有找到一个好的方法来使用它,它比我现在做的更好吗?所有相关的答案都是正确的


共 (3) 个答案

  1. # 1 楼答案

    是的,你的权利是:为了安全起见,你不能在另一个线程上修改视图(这就是为什么它被称为UI线程)。它可以防止用户界面数据处于不一致的状态,这可能会导致应用程序崩溃,并且很难调试。所以android API只是禁止这样做(这是个好主意)。这是一种常见的UI模式,在大多数API中都可以找到

    可以使用post()runOnUiThread()更新任何视图:

    anyView.post(new Runnable() {
        public void run() {
            // do update here
        }
    });
    

    为什么是这种模式
    同步不是免费的。它会影响性能。因此,将对UI的修改保持在同一线程上更容易

    如果我可以修改来自不同线程的数据,会发生什么
    例如:线程A正在更改视图的颜色,而线程B正在同时读取颜色。由于多线程不能保证先执行哪条指令,因此可能会得到意外的结果。颜色是黑色(0|0|0),之前,线程A想要设置白色(255|255|255),并首先将红色组件设置为255,线程B开始读取,并在线程A有机会完成并获得红色(^})之前获得整个颜色

    这是一个简单的例子,它会影响视觉效果,但如果对一些非常重要的数据发生这种情况,您的应用程序将严重崩溃,这样的错误非常严重,很难调试。关于多线程有很多需要学习的地方,也许this java tutorial是一个很好的起点

  2. # 2 楼答案

    安全性不是唯一的UI线程,也是唯一可以访问视图的线程。主要原因是视图背后的代码可能不是线程安全的。这意味着,如果有多个线程读取和写入公共变量,则无法保证数据不会被破坏

    看看这个great wikipedia article about thread safety.

  3. # 3 楼答案

    Android应用程序使用Single Thread Model,该线程负责向UI元素发送各种事件。这个单线程模型有两条规则:

    1. 不要阻塞UI线程
    2. 不要从UI线程外部访问Android UI工具包

    如果创建的线程在UI thread之外使用View,那么它违反了第二条规则