在.NET和Android以及我确信其他框架中,我都注意到了这个问题,在这个问题上,您的任务要花很长时间才能完成,因此无法执行UI线程。
假设您有一个方法,可以用来自网络位置/internet的文本更新标签,并在3-4秒后再次返回,并适当设置标签。它支持UI线程。因此,您的第一个调用端口是将方法调用移动到另一个线程。但这不只是起作用..。因为您不能再更新标签的文本,因为这只能在UI线程中进行.
因此,语言提供了一些类似于
runOnUiThread(() -> {
label.setText(myNewFoundInformationFrom);
});这个例子来自使用lambda的Android,无疑是对我们10年前使用的一个巨大的改进。
也许在更远的地方你会发现自己在不同的地方做这些.所以您可能会创建一个方法
void setLabelText(string newText)
runOnUiThread(() -> {
label.setText(newText);
});至少在Android的情况下..。不管我从哪个线程运行它,它都能工作。
所以这让我怀疑..。为什么不让Microsoft/Google和所有的用户界面控件都更新方法/函数,以确保它们以这种方式从UI线程中运行--这样我们就不必这么做了?
发布于 2015-01-09 15:17:29
有一些问题可能会阻止这种总是runInUiThread方法。
主要的问题是,如果您处于一个非UI线程中,您的操作会被提交到队列中而被推迟,因此您不知道您的操作何时实际生效。如果您有几个更改需要同时生效,则需要将它们分组到lambda/function中,并像往常一样发布,否则另一个线程可能会在任务之间插入一个已发布的任务。
这在资源同步方面有类似之处,在这种情况下,您需要在同一个锁下执行多个操作是非常常见的。
同步函数很重要,因为有时您需要知道在继续之前,结果是被锁定的。
发布于 2015-01-09 16:05:35
当您只想更改一个标签时,您建议的解决方案没有问题。然而,至少有两种情况,这是合理的:
https://softwareengineering.stackexchange.com/questions/269562
复制相似问题