Android性能:以编程方式添加视图,将视图设置为GONE / VISIBLE

时间:2014-07-08 13:22:23

标签: android performance android-layout android-view

我正在一个项目中工作,当用户第一次打开应用程序时,需要通过简单的教程查看。我试图这样做"正确的方式",我对性能问题感到疑惑。

目前,我在我的布局中将视图设置为android:visibility="GONE",我根据SharedPreference将其更改为VISIBLE。这允许我让用户了解应用程序在首次启动时的工作方式。

我想知道在我的片段中呈现视图时它意味着什么。我的猜测是,即使视图的可见性设置为GONE,视图也会无用地膨胀。

现在,我正在思考一个替代方案:如果我只在第一次启动时添加我的视图,但是在我的片段onCreateView中以编程方式添加。这应该允许视图在以后的发布时不被夸大,但是不会以编程方式膨胀视图意味着首次启动时性能不佳?

3 个答案:

答案 0 :(得分:9)

因此,为了回答我自己的问题,我使用了DDMS工具TraceView来监控来自我的片段onAttach的调用,直到onResume。它让我看看哪种实现效率较低。

为了进行测试,我有一个简单的RelativeLayout,里面有FrameLayout(一直显示)。我使用自定义布局每次添加,无论是以编程方式还是在我的布局文件中具有GONE的可见性。自定义布局由一个包含4个子项的RelativeLayout组成(ImageView,TextView,View和Button)。

我的onCreateView如下所示,允许应用根据两个static final boolean常量来扩展正确的布局,以更改布局。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    LinearLayout root;
    if(INFLATE_PROGRAMMATICALY) {
        root = (LinearLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false);
        if(SHOULD_FYI_VIEW_BE_SHOWN) {
            View tutoView = inflater.inflate(R.layout.inner_view, root, false);
            root.addView(tutoView);
        }
    } else {
        root = (LinearLayout) inflater.inflate(R.layout.fragment_test_gone,container,false);
        if(SHOULD_FYI_VIEW_BE_SHOWN) {
            View tutoView = root.findViewById(R.id.RL_inner_view);
            tutoView.setVisibility(View.VISIBLE);
        }
    }
    return root;
}

这导致以下结果:

当夸张的可选布局

SHOULD_FYI_VIEW_BE_SHOWN=true

当只有视图从GONE更改为VISIBLE时,TraceView给出的最大“实时估算值”为 75ms ,但 110ms ,当我们需要实例化inner_view

当可选布局没有膨胀时 SHOULD_FYI_VIEW_BE_SHOWN=false

在这种情况下,TraceView给出的最大实时估计值对于GONE视图的通胀为 102ms ,而当视图膨胀时为 39ms 没有GONE视图。

因此,为了在不需要夸大视图时获得性能提升,我会说最好的解决方案是以编程方式扩展您的视图,如果您只需要显示几次

您可以在Gist

上找到测试项目

答案 1 :(得分:5)

我认为你正在重新发明轮子。对于这种情况,Android xml布局中已经存在现有工具。它被称为ViewStub。您可以在此处阅读更多内容:Loading ondemand

答案 2 :(得分:1)

我想我只是偶然发现了你的表现问题的答案。

来自Animation Docs

  

对于正在淡入的视图,请将其可见性设置为GONE。这个   阻止视图占用布局空间,从布局中忽略它   计算,加快处理速度。

这意味着只要您不将android:visibility设置为除GONE之外的其他任何内容,性能就不会受到影响。