Android性能:以编程方式添加视图,而不是将视图设置为GONE/VISIBLE
我在一个项目中工作,当用户第一次打开应用程序时,需要膨胀一个简单的教程视图。我正试图用“正确的方式”来做这件事,我想知道性能问题 目前,我的布局中有一个视图设置为Android性能:以编程方式添加视图,而不是将视图设置为GONE/VISIBLE,android,performance,android-layout,android-view,Android,Performance,Android Layout,Android View,我在一个项目中工作,当用户第一次打开应用程序时,需要膨胀一个简单的教程视图。我正试图用“正确的方式”来做这件事,我想知道性能问题 目前,我的布局中有一个视图设置为android:visibility=“GONE”,根据共享的引用,我将其更改为VISIBLE。这让我可以让用户了解应用程序在首次启动时是如何工作的 我想知道的是,当视图在我的片段中呈现时,它意味着什么。我的猜测是,视图将被无用地膨胀,即使其可见性设置为消失 现在,我在考虑另一种选择:如果我只在第一次启动时添加视图,但以编程方式,在片段
android:visibility=“GONE”
,根据共享的引用,我将其更改为VISIBLE
。这让我可以让用户了解应用程序在首次启动时是如何工作的
我想知道的是,当视图在我的片段中呈现时,它意味着什么。我的猜测是,视图将被无用地膨胀,即使其可见性设置为消失
现在,我在考虑另一种选择:如果我只在第一次启动时添加视图,但以编程方式,在片段的
onCreateView
中添加视图,该怎么办。这应该允许视图在以后的发布中不会膨胀,但以编程方式膨胀视图不会意味着在第一次发布时性能不好吗?我想我只是偶然发现了您性能问题的答案
从:
对于正在淡入的视图,将其可见性设置为“消失”。这
防止视图占用布局空间,并将其从布局中忽略
计算,加快处理速度。
这意味着性能不会受到影响,只要您不将
android:visibility
设置为除GONE
之外的任何内容,那么,为了回答我自己的问题,我使用DDMS工具TraceView
监视来自我的片段onAttach
的调用,直到它的onResume
。它让我看到哪些实现效率较低
为了进行测试,我有一个简单的RelativeLayout
,里面有一个FrameLayout
(一直显示)。每次添加时,我都使用自定义布局,可以是编程方式,也可以是在布局文件中显示GONE。自定义布局由一个带有4个子项的RelativeLayout(一个ImageView、一个TextView、一个View和一个按钮)组成
我的onCreateView
如下所示,允许应用程序基于两个静态最终布尔值
常量膨胀正确的布局,以更改布局
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;
}
这将导致以下结果:
当可选布局处于充气状态时
是否显示视图=true
TraceView给出的最大“实时估计”值为75ms,当视图从已消失
更改为可见
,但当我们需要实例化内部视图
时为110ms
当可选布局未充气时
是否应显示视图=false
在这种情况下,TraceView给出的GONE
视图膨胀的最大实时估计值为102ms,而当膨胀的视图没有GONE
视图时,最大实时估计值为39ms
因此,为了在视图不需要膨胀的情况下提高性能,我认为最好的解决方案是以编程方式膨胀视图(如果只需要显示几次)
你可以在一台电脑上找到这个测试项目,我想你是在重新发明一个轮子。对于这个场景,Android xml布局中已经存在了一个工具。它被称为ViewStub。您可以在此处阅读更多内容:不确定性能比较。但如果它真的像第一次运行时的教程,那么试试:)@PurpleDroid好吧,我现在实际上是将它显示为一个
cardwiew
。这只是第一次使用的参考资料,不是真正的教程!:-)@玛奇米奇:对不起,我得问你“你试过什么?”。使用诸如DDMS之类的工具很容易跟踪使用logcat的应用程序的进度。为什么你不自己尝试一下不同的方法,看看会发生什么?@Squonk嗯,我还没有真正有机会玩android调试工具和DDM。我想可能有人知道这个平台是如何工作的,但你是对的,我一定要试试。我现在就尝试这样做,当我发现有价值的东西时,我会更新这个帖子TraceView
实际上可能会起作用。