我在一个项目中工作,该项目需要在用户首次打开应用程序时扩充一个简单的教程 View 。我正在尝试以“正确的方式”进行操作,但我想知道性能问题。
目前,我在我的布局中有一个 View 设置为 android:visibility="GONE"
,我根据 SharedPreference 将其更改为 VISIBLE
。这让我可以让用户了解该应用程序在首次启动时的工作方式。
我想知道当 View 在我的 fragment 中呈现时它意味着什么。我的猜测是 View 将被无用地放大,即使它的可见性设置为 GONE
。
现在,我正在考虑一个替代方案:如果我只在第一次启动时添加我的 View ,但是以编程方式,在我的 Fragment 的 onCreateView
中。这应该允许 View 在以后的启动时不会膨胀,但不会以编程方式膨胀 View 意味着首次启动时性能不佳?
最佳答案
因此,为了回答我自己的问题,我使用了 DDMS 工具 TraceView
来监控从我的 fragment onAttach
到它的 onResume
的调用。它让我看到哪种实现效率较低。
为了进行测试,我有一个简单的 RelativeLayout
,里面有一个 FrameLayout
(一直显示)。我每次都使用自定义布局以编程方式或在我的布局文件中显示 GONE 来添加。自定义布局由具有 4 个子项(ImageView、TextView、View 和 Button)的 RelativeLayout 组成。
我的 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
当只有一个 View 从GONE
更改为VISIBLE
时,TraceView 给出的最大“实时估计”为75ms ,但是当我们需要实例化 inner_view
时 110ms。
当可选布局未膨胀时
SHOULD_FYI_VIEW_BE_SHOWN=false
在这种情况下,对于 GONE
View 的膨胀,TraceView 给出的最大实时估计是 102ms,而当膨胀的 View 没有 GONE
View 。
因此,为了在 View 不需要膨胀时获得性能提升,我认为最好的解决方案是以编程方式膨胀您的 View ,如果您只需要显示几次.
您可以在 Gist 上找到测试项目
关于安卓性能 : Adding view programmatically vs setting view to GONE/VISIBLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633002/