Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-视图的类变量与方法变量_Android_Performance - Fatal编程技术网

Android-视图的类变量与方法变量

Android-视图的类变量与方法变量,android,performance,Android,Performance,在处理Android视图时,哪种方式是更好的内存管理编程方式?我相信第二种方法更好,因为TextView只在需要时才被访问,然后,希望是垃圾收集。我很想听听你的意见 public class MainActivity extends Activity { TextView tvHelp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(sav

在处理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");
     }
  }

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

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

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

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

      在您的情况下,就内存消耗而言,这并没有什么区别。无论您是否保留对该视图的引用,该活动都将通过其层次结构保留对该视图的引用,直到该视图被销毁。释放对它的引用不会使它被垃圾收集

      一旦活动通过
      onDestroy()
      ,它和它的视图层次结构都将被垃圾收集,因此对于这种情况,我不必担心区别

      这可能产生不同的一种情况是
      片段
      s中的
      视图
      生命周期与组件生命周期不同。从
      onCreateView()
      onViewCreated()
      保存对
      视图的引用会在它们返回时暂时导致额外的内存使用。您可以在
      onDestroyView()
      中释放引用,因为它们无论如何都无效——除非您手动保留整个视图层次结构


      欲了解更多信息:

      在您的情况下,就内存消耗而言,这并没有什么区别。无论您是否保留对该视图的引用,该活动都将通过其层次结构保留对该视图的引用,直到该视图被销毁。释放对它的引用不会使它被垃圾收集

      一旦活动通过
      onDestroy()
      ,它和它的视图层次结构都将被垃圾收集,因此对于这种情况,我不必担心区别

      这可能产生不同的一种情况是
      片段
      s中的
      视图
      生命周期与组件生命周期不同。从
      onCreateView()
      onViewCreated()
      保存对
      视图的引用会在它们返回时暂时导致额外的内存使用。您可以在
      onDestroyView()
      中释放引用,因为它们无论如何都无效——除非您手动保留整个视图层次结构


      更多信息:

      问题是我有一个相当大的应用程序,我用第一种方法来做,这在堆上变得非常昂贵,因为有很多视图。该应用程序运行缓慢,因为它占用了大量内存来保存这些视图。我一直认为第二种方法更好,因为至少内存使用会更加动态,如果对象不被使用,它们不会留在周围。使用第二种解决方案确实会获得一些内存,但我怀疑这是否会降低应用程序的速度。您是否在整个应用程序中仅使用了一项活动?从一个活动切换到另一个活动时,您持有的视图/资源将是GC。问题是,我有一个相当大的应用程序,我用第一种方法做它,这在堆上变得非常昂贵,因为有很多视图。该应用程序运行缓慢,因为它占用了大量内存来保存这些视图。我一直认为第二种方法更好,因为至少内存使用会更加动态,如果对象不被使用,它们不会留在周围。使用第二种解决方案确实会获得一些内存,但我怀疑这是否会降低应用程序的速度。您是否在整个应用程序中仅使用了一项活动?从一个活动切换到另一个活动时,您持有的视图/资源将是GC。你也可以看看这是否有什么不同。