【问题标题】:Is it ok to use setContentView() once in OnResume()是否可以在 OnResume() 中使用一次 setContentView()
【发布时间】:2016-04-24 23:56:35
【问题描述】:

我听说过使用setContentView() 是多么糟糕的事情

Pattern "One activity, multiple views": Advantages and disadvantages

但是我想知道,如果我在活动的onResume() 方法中使用一次setContentView(),我的应用程序是否不太可能导致内存泄漏?

每当用户打开我的应用程序时,它都会检查设置中是否启用了某些功能。如果已启用,则应用使用与原始屏幕不同的屏幕。

因此我的代码如下所示:

 @Override
    protected void onResume() {
       super.onResume();
       InputMethodManager im = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
       String list = im.getEnabledInputMethodList().toString();
       if(Stuff is true){
        setContentView(R.layout.activityscreen_enabled);
       }
   }

}

使用setContentView() 是否不太可能导致内存泄漏和其他此类问题?还是有更好的解决方案?

【问题讨论】:

    标签: android


    【解决方案1】:

    我从几年前就开始使用 Android 了,但我从来没有这样做过,因为我喜欢坚持在 onCreate 中几乎总是包含 setContentView 的模式。

    但是,我不相信您这样做会遇到很大的麻烦(我的意思是内存泄漏)。

    尽管如此,我看不出做这种事情的意义,Activity 的模式(或者我如何理解)更多:

    我在onCreate 中创建一个视图,并在onResume 中更新其数据,如果数据为 A,则添加/删除此视图,如果数据为 B,则添加/删除此其他视图。

    为了完整起见,我阅读了您的(非常好的)链接,我认为您可能误解了如何应用 Commonsware 所说的:您可以拥有多个视图而没有不同的setContentView:在这种情况下,您的视图结构需要, 真正模块化,您将能够动态加载所有子视图(或者,至少,我和我的同事正在这样做;))。

    对于您的示例,我将为活动的基础设置一个空布局(假设为蓝色背景),然后对于我想要拥有的每个视图(每种情况),我将拥有一个加载的动态布局生命周期中的某个点(可能在onResume)。我不相信你的所作所为特别糟糕,但我怀疑它是这样认为的^^

    这个link同意我的看法

    【讨论】:

      【解决方案2】:

      如果您需要多个屏幕,请使用Fragment,甚至创建一个新的Activity,因为某些原因会弄乱视图

      • 整个应用只有一个Activity 不好,否则会很长很复杂。
      • 您的onResume() 需要处理新视图及其 ID、onClickListeners... 等。
      • onCreate() 不同,onResume() 被多次调用,因此一遍又一遍地加载视图会浪费时间和内存。
      • 根据活动生命周期中的android doc关于onPause()onResume()

      因为这种状态可以经常转换,所以这两种方法中的代码应该是相当轻量级的,以避免让用户等待的缓慢转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 2023-01-19
        • 2021-06-11
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多