安卓性能 : Adding view programmatically vs setting view to GONE/VISIBLE

标签 android performance android-layout android-view

我在一个项目中工作,该项目需要在用户首次打开应用程序时扩充一个简单的教程 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_view110ms

当可选布局未膨胀时 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/

相关文章:

android - Kotlin fragment 类型不匹配

android - SQLite 选择所有行并添加到 ListView Android

android - Android Wear 上的通知有效,但数据层无效

python - 使用 Python 替换列表中的值

multithreading - 多线程程序如何更节能?

android - TextView - 分割线

android - 发布 Android 应用程序后谷歌地图不显示?

android - 单击按钮时的条件

android - 从 BottomSheetDialog 获取 BottomSheetBehaviour

android - Android布局绘制有什么比较高效的?安卓 :textColor ="#FFFFFF" or android:textColor ="@android:color/white"?