我正在一个项目中工作,当用户第一次打开应用程序时,需要通过简单的教程查看。我试图这样做"正确的方式",我对性能问题感到疑惑。
目前,我在我的布局中将视图设置为android:visibility="GONE"
,我根据SharedPreference将其更改为VISIBLE
。这允许我让用户了解应用程序在首次启动时的工作方式。
我想知道在我的片段中呈现视图时它意味着什么。我的猜测是,即使视图的可见性设置为GONE
,视图也会无用地膨胀。
现在,我正在思考一个替代方案:如果我只在第一次启动时添加我的视图,但是在我的片段onCreateView
中以编程方式添加。这应该允许视图在以后的发布时不被夸大,但是不会以编程方式膨胀视图意味着首次启动时性能不佳?
答案 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)
我想我只是偶然发现了你的表现问题的答案。
对于正在淡入的视图,请将其可见性设置为GONE。这个 阻止视图占用布局空间,从布局中忽略它 计算,加快处理速度。
这意味着只要您不将android:visibility
设置为除GONE
之外的其他任何内容,性能就不会受到影响。