我有一个奇怪的UI行为让我觉得这个API可能是异步的。假设它是(异步),我做了一些更改,现在UI按预期工作。我没有在Apple的文档中找到答案。 有人熟悉或有过这方面的经验吗?真的是异步吗?谢谢!
编辑:所有UI更改都是从主线程进行的。
答案 0 :(得分:0)
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//put your code here
}
});
更新框架并告诉系统在下一个绘图周期中重绘窗口(可能还有子视图)。 Cocoa绘图总是在绘制周期中完成,而不是在您调用绘图方法时。有关此问题的更多讨论,请参阅What is the most robust way to force a UIView to redraw?。
这更好地被认为是绘图被“整合”而不是“异步”。除非有动画,否则所有绘图通常应在下一个事件循环之前完成。视图可能以某种方式将其绘制延迟到稍后的事件循环,但很少见。 10.8+中的图层支持视图可以支持实际的异步绘图,但这不是默认设置。
根据您的描述,您可能从主线程以外的线程调用setFrame:display:
。 AppKit绘图不是线程安全的。除了主线程之外,你不能从任何地方调用绘图方法,否则你会得到“奇怪的UI行为”。 (这不完全正确。在OS X上,您可以使用setFrame:display:
从其他线程绘制,但在解锁焦点后,它们仍然不会在下一个绘图周期之后实际应用。但通常情况下它最好只是从现代OS X中的主线程中抽取,因为GCD使这很简单。)