安卓视图:在设置可见性之前检查可见性是否可以提高性能?

24
我有一些帮助方法,根据传递给这些方法的状态变量设置特定 View 的可见性。有时,这些方法会被多次调用,而 View 的可见性不会改变。因此,我开始在设置之前检查每个 View 的可见性,并考虑到:“将 View 的可见性更改为相同的可见性并没有意义,这样只会导致无谓的刷新。”请注意保留 HTML 标签。
            if (myView.getVisibility() != View.VISIBLE) {
                myView.setVisibility(View.VISIBLE);
            }
            etc...

然而,现在我想知道setVisibility的实现是否已经考虑到这一点,并检查您是否正在将相同的可见性设置为View已经具有的内容,以避免不必要地刷新View(这是我的代码尝试做的)。

那么,有人知道我的“优化”是否真正提高了任何性能,或者API已经领先于我吗?


是的,您正在提高性能,因为您不会让虚拟机每次都加载 setVisibility - Mohammad Ersan
@Geobits 实际上就像你所说的,如果可见性相同,则设置可见性不会刷新视图,但是如果他在询问代码性能方面,这将有所改善。 - Mohammad Ersan
但是 setVisibilty 将调用另外两个方法:1- setFlags,2- mBackground.setVisible - Mohammad Ersan
所有这些方法都会被加载,即使它们不起作用。 - Mohammad Ersan
1
我更关心的是不刷新“View”,检查可见性的方法调用可以忽略(在我想要改进的范围内)。我只是想确保我没有进行已经发生的检查(现在我知道了)。谢谢大家的帮助。 - Steven Byle
1个回答

52
他们已经领先一步。请查看View.java:setVisibility()的代码:
public void setVisibility(int visibility) {
    setFlags(visibility, VISIBILITY_MASK);
    ...
}

它调用 setFlags() 方法:
void setFlags(int flags, int mask) {
    int old = mViewFlags;
    mViewFlags = (mViewFlags & ~mask) | (flags & mask);

    int changed = mViewFlags ^ old;
    if (changed == 0) {
        return;
    }
    ....
} 

它检查标志是否与当前状态匹配。如果是,则仅返回而不执行任何操作。

1
太好了,这正是我想知道的。我会删除我的双重检查并提高代码可读性。谢谢您! - Steven Byle
2
我正准备创建类似的标志..很幸运看到了你的答案。 - Maher Abuthraa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接