当前位置: 首页 > 面试题库 >

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

逄念
2023-03-14
问题内容

我知道没有线程可以访问当前视图,除非它是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)而不是黑色。

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



 类似资料:
  • 问题内容: 我一直在寻找一些方法来轻松地对我的一些简单分析代码进行多线程处理,因为我注意到numpy仅使用一个内核,尽管事实上它应该是多线程的。 我知道numpy是为多个内核配置的,因为我可以看到使用numpy.dot的测试使用了我的所有内核,因此我只是将Mean重新实现为点积,并且运行速度更快。是否有某些原因意味着不能自己快速运行?我发现较大的数组具有类似的行为,尽管该比率比示例中显示的3接近2

  • 问题内容: 当用户选择在另一个线程中启动阻止进程的菜单项时,我试图在JavaFX 8应用程序中提供反馈。在我的实际应用程序中,它是文件下载,但是通过示例,我使用最少的代码创建了一个测试用例: 它的工作方式如下:当选择“开始”菜单项时,主菜单文本应立即更改为“正在运行…”,然后应附加“完成!”。经过5秒钟的模拟我的文件下载的睡眠。 实际上发生的是,即使我正在使用,在阻止过程完成 后 , 两个 文本更

  • 本文向大家介绍请为什么说js是单线程,而不是多线程呢?相关面试题,主要包含被问及请为什么说js是单线程,而不是多线程呢?时的应答技巧和注意事项,需要的朋友参考一下 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript

  • 我正在通过quartz调度程序调用spring批处理作业,它应该每1分钟运行一次。当作业第一次运行时,成功打开ItemReader并运行作业。但是,当作业尝试第二次运行时,它使用的是第一次运行的相同实例,该实例已经初始化,并接收“java.lang.IllegalStateException:Stream is eignitialized.Close before re-opening”。我已经将

  • 此答案指示如何将转换为,同时管理将发生阻塞的位置: 我的问题和评论中的问题一样: 怎么了?为什么你使用一个额外的线程与Promise结合? 答复如下: 它会在你拉线的时候卡住线。如果您已经为这样的未来配置了ExecutionContext,这很好,但是默认的ExecutionContext包含的线程与您拥有的处理器一样多。 我不确定我是否理解这个解释。重申: 有什么问题?在未来内部阻塞不是和手动创

  • 问题内容: 请用代码示例说明为什么SimpleDateFormat不是线程安全的。这节课有什么问题? 是SimpleDateFormat的格式功能问题吗?请提供一个在课堂上演示此错误的代码。 FastDateFormat是线程安全的。为什么?SimpleDateFormat和FastDateFormat有什么区别? 请用代码说明这个问题? 问题答案: 将中间结果存储在实例字段中。因此,如果两个线程