ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-为什么非UI线程的线程无法访问视图?

2019-10-11 12:30:03  阅读:222  来源: 互联网

标签:ui-thread android java


我知道没有线程可以访问当前视图,除非它是UI线程.我想知道为什么吗?哪个线程更改视图为什么很重要?是出于安全原因吗?这是我使用的解决方法:

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

            handler.post(run);
        }

        private Handler handler;'

每当我想更改布局时,这样做都是一种痛苦.是否有其他解决方法?我了解异步任务,但从未找到一种使用它的好方法,它比我正在做的更好吗?所有相关的答案都适用!

解决方法:

是的,您的权利:为了安全起见,您不能在另一个线程上修改视图(这就是为什么将其称为UI线程).它可以防止UI数据处于不一致状态,这可能会使您的应用程序崩溃,并且很难调试.因此,Android API只是禁止这样做(这是个好主意).这是大多数API中常见的UI模式.

您可以使用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之前的全部颜色有机会完成并获得红色(255 | 0 | 0)而不是黑色.

这是一个简单的示例,可能会影响视觉效果,但是如果某些真正重要的数据发生这种情况,则您的应用程序将严重崩溃,并且这样的错误是如此令人讨厌且难以调试.关于多线程有很多东西要学习,也许this java tutorial是一个很好的起点…

标签:ui-thread,android,java
来源: https://codeday.me/bug/20191011/1892659.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有