【问题标题】:Android - Class variable vs method variable for ViewsAndroid - 视图的类变量与方法变量
【发布时间】:2016-02-13 01:28:18
【问题描述】:

在处理 Android 视图时,哪种方式更好地进行内存管理编程?我相信第二种方法更好,因为 TextView 仅在需要时才被访问,然后希望垃圾收集。很想听听您的意见!

  public class MainActivity extends Activity {
     TextView tvHelp; 

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 

        tvHelp = (TextView) layout.findViewById(R.id.ivHelp);
        tvHelp.setText("Started"); 
     }


     @Override
     public void onResume() {
        super.onResume();

        tvHelp.setText("Resumed");
     }
  }

或者这个

  public class MainActivity extends Activity { 

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 

        TextView tvHelp = (TextView) findViewById(R.id.ivHelp);
        tvHelp.setText("Started"); 
     }


     @Override
     public void onResume() {
        super.onResume();

        TextView tvHelp = (TextView) findViewById(R.id.ivHelp);
        tvHelp.setText("Resumed");
     }
  }

【问题讨论】:

    标签: android performance


    【解决方案1】:

    这并没有太大的区别。第一个将帮助您避免多次调用findViewById(),这会消耗CPU。第二个将帮助您在堆上保留一些字节。但是通过这样做,您还将创建未引用的对象,这些对象将堆叠在堆上,直到 GC 通过(这会消耗 CPU)。 GC 也会在内存耗尽时启动(例如,当您创建未引用的对象时)。所以第一个解决方案绝对是最好的解决方案。 你会避免:

    • 代码重复
    • 多次调用findViewById
    • 在 GC 通过之前,将在堆中堆叠的未引用对象

    【讨论】:

    • 问题是我有一个相当大的应用程序,我是用第一种方式做的,因为有很多视图,这在堆上变得非常昂贵。该应用程序运行缓慢,因为它使用大量内存来保存这些视图。我在想第二种方法更好,因为至少内存使用会更加动态,并且如果不使用对象就不会留下来
    • 您确实会通过使用第二种解决方案获得一些内存,但我怀疑它会减慢您的应用程序。您是否在整个应用程序上仅使用 1 个活动?从一个活动切换到另一个活动时,您持有的视图/资源将是 GC。您也可以convert your instance variables with the help of your IDE 看看是否有什么不同。
    【解决方案2】:

    在您的情况下,就内存消耗而言,它不会真正产生任何影响。 Activity 将通过其层次结构保持对该视图的引用,直到它被销毁,无论您是否保留对它的引用。释放您对它的引用不会使其被垃圾收集。

    一旦 Activity 通过onDestroy(),它和它的视图层次无论如何都会被垃圾回收,所以对于这种情况,我不会担心差异。

    这可以产生影响的一种情况是Fragments,其中View 生命周期与组件生命周期不同。从onCreateView()onViewCreated() 持有对View 的引用可能会在它们进入后台堆栈后暂时导致额外的内存使用。您可以释放onDestroyView() 中的引用,因为它们无论如何都不会有效——除非您手动保留整个视图层次结构。

    欲了解更多信息:https://stackoverflow.com/a/26370042/321697

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多