首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不所有的UI控制方法RunOnUIThread

为什么不所有的UI控制方法RunOnUIThread
EN

Software Engineering用户
提问于 2015-01-09 12:00:49
回答 2查看 1.6K关注 0票数 3

在.NET和Android以及我确信其他框架中,我都注意到了这个问题,在这个问题上,您的任务要花很长时间才能完成,因此无法执行UI线程。

假设您有一个方法,可以用来自网络位置/internet的文本更新标签,并在3-4秒后再次返回,并适当设置标签。它支持UI线程。因此,您的第一个调用端口是将方法调用移动到另一个线程。但这不只是起作用..。因为您不能再更新标签的文本,因为这只能在UI线程中进行.

因此,语言提供了一些类似于

代码语言:javascript
复制
      runOnUiThread(() -> {
       label.setText(myNewFoundInformationFrom);
});

这个例子来自使用lambda的Android,无疑是对我们10年前使用的一个巨大的改进。

也许在更远的地方你会发现自己在不同的地方做这些.所以您可能会创建一个方法

代码语言:javascript
复制
void setLabelText(string newText)
 runOnUiThread(() -> {
    label.setText(newText);
    });

至少在Android的情况下..。不管我从哪个线程运行它,它都能工作。

所以这让我怀疑..。为什么不让Microsoft/Google和所有的用户界面控件都更新方法/函数,以确保它们以这种方式从UI线程中运行--这样我们就不必这么做了?

EN

回答 2

Software Engineering用户

发布于 2015-01-09 15:17:29

有一些问题可能会阻止这种总是runInUiThread方法。

主要的问题是,如果您处于一个非UI线程中,您的操作会被提交到队列中而被推迟,因此您不知道您的操作何时实际生效。如果您有几个更改需要同时生效,则需要将它们分组到lambda/function中,并像往常一样发布,否则另一个线程可能会在任务之间插入一个已发布的任务。

这在资源同步方面有类似之处,在这种情况下,您需要在同一个锁下执行多个操作是非常常见的。

同步函数很重要,因为有时您需要知道在继续之前,结果是被锁定的。

票数 1
EN

Software Engineering用户

发布于 2015-01-09 16:05:35

当您只想更改一个标签时,您建议的解决方案没有问题。然而,至少有两种情况,这是合理的:

  1. 同步。比方说,您想要更新按钮文本并启用/禁用它。对于runOnUiThread,不需要显式同步或锁定。
  2. 批量更新。如果您正在更新许多项,那么对每一项调用runOnUiThread将损害性能。(嗯,如果有可怕的数量的项目,你应该把它们分成几个批次。)
票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/269562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档