Android 是不是将视图对象层次结构保留在内存中?

Posted

技术标签:

【中文标题】Android 是不是将视图对象层次结构保留在内存中?【英文标题】:Does Android keep the view object hierarchy in memory?Android 是否将视图对象层次结构保留在内存中? 【发布时间】:2020-03-19 08:28:33 【问题描述】:

当我创建一个按钮时:

@Override
public void onCreate(Bundle savedInstanceState)

   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   LinearLayout layout = …;

   Button btn = new Button(this);
   btn.setText("My Button");

   layout.addView(btn);

如果我不保留对 btn 的强引用,android 是否会保持 btn 实例处于活动状态?

例如,layout.getChildView(0) 是否返回确切的实例 (btn)?还是 Android 创建并返回 Button 的新实例并返回它?

我不是在谈论子类化(例如class MyButton extends Button),我认为它显然必须保存在内存中,我只是在询问内置视图类。

【问题讨论】:

【参考方案1】:

ViewGroup 将对其子项的强引用存储在一个数组中。如果您查看 ViewGroup 来源,您会发现以下字段:

private View[] mChildren;

当你调用 getChildAt 时,你会从这个数组中得到一个实例:

public View getChildAt(int index) 
    if (index < 0 || index >= mChildrenCount) 
        return null;
    
    return mChildren[index];

【讨论】:

【参考方案2】:

对于任何视图组,当您一次添加任何子视图时,它不会创建新实例。

【讨论】:

对不起,我不明白。什么意思? 它不会创建新实例,假设您已将一个 textview 添加到任何视图组,然后如果您更新 textview,它将反映。所以这意味着它是引用,而不是创建新实例。 但是如果您添加的 textview 没有反映他们的更改,那么我们可以说它正在创建新实例。 谢谢,但这不是我要问的。 要求什么??抱歉,我无法理解,

以上是关于Android 是不是将视图对象层次结构保留在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构

在Android中绘制之前测量所有视图层次结构

将视图层次结构旋转 90 度

在 ASP.NET MVC 中构造视图层次结构的最佳方法是啥?

在关系数据库中存储文件夹层次结构

android将工具栏扩展到半透明状态栏,同时将其他布局对象保留在系统视图中