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

Mag*_*cky 15 performance android android-layout android-view

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

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

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

现在,我正在考虑另一种选择:如果我只在第一次启动时添加我的视图,但在编程方面,在我的片段中添加我的视图onCreateView.这应该允许视图在以后的启动时不被夸大,但不会以编程方式膨胀视图意味着首次启动时性能不佳?

Mag*_*cky 9

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

为了进行测试,我有一个简单RelativeLayoutFrameLayout内部(一直显示).我使用自定义布局每次添加,无论是以编程方式还是在我的布局文件中具有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;
}
Run Code Online (Sandbox Code Playgroud)

这导致以下结果:

膨胀时的可选布局

SHOULD_FYI_VIEW_BE_SHOWN=true

由TraceView给出的最大"实时估计"是75ms时,有刚刚从更改视图GONEVISIBLE,但110毫秒时,我们需要实例化inner_view.

当可选布局未膨胀时 SHOULD_FYI_VIEW_BE_SHOWN=false

在这种情况下,通过TraceView给出的最大实时估计是102ms用于的膨胀GONE视图,与39MS当充气时,视图不具有GONE图.

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

您可以在Gist上找到测试项目


use*_*123 5

我认为您正在重新发明轮子。对于这种情况,Android xml布局中已经存在工具。它称为ViewStub。您可以在此处了解更多信息:按需加载