Activity的onDestroy/Fragment的onDestroyView设置了Null实践

34 android ondestroy android-fragments android-activity

我正在阅读ListFragment源代码,我看到了这个实现:

ListAdapter mAdapter;
ListView mList;
View mEmptyView;
TextView mStandardEmptyView;
View mProgressContainer;
View mListContainer;
CharSequence mEmptyText;
boolean mListShown;

/**
 * Detach from list view.
 */
@Override
public void onDestroyView() {
    mHandler.removeCallbacks(mRequestFocus);
    mList = null;
    mListShown = false;
    mEmptyView = mProgressContainer = mListContainer = null;
    mStandardEmptyView = null;
    super.onDestroyView();
}
Run Code Online (Sandbox Code Playgroud)

在此函数中,Google开发人员将Null设置为在ListFragment中声明的所有视图字段,并删除回调"mRequestFocus".

ListActivity源代码中.Google开发人员实施如下:

protected ListAdapter mAdapter;
protected ListView mList;

private Handler mHandler = new Handler();


@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRequestFocus);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

我没有看到Google开发人员在ListActivity的onDestroy上将Null设置为mList,就像他们为ListFragment类所做的那样.

我的问题是

  1. 为什么谷歌开发者没有在ListActivity的onDestroy中将Null设置为mList?有什么原因?

  2. 我们是否需要将Null设置为Activity的onDestroy和Fragment的onDestroyView中的所有View字段?

3.在这两个函数中设置Null的任何做法:Activity的onDestroy和Fragment的onDestroyView?

谢谢你的想法!

kco*_*ock 63

因此,碎片与活动之间存在差异的原因是因为它们的生命周期不同.当一个Activity被摧毁时,它会永远消失.但是,Fragments可能会在实际销毁之前多次创建和销毁他们的视图.有关说明,请参阅活动:

onDestroy()
onCreate()
Run Code Online (Sandbox Code Playgroud)

永远不会按顺序发生同一个Activity实例.对于片段,以下内容完全有效:

onCreate()
onCreateView()
onDestroyView()
onCreateView()
onDestroyView()
onDestroy()
Run Code Online (Sandbox Code Playgroud)

您可以看到这种情况的一种情况是当Fragment进入后栈时.它的视图将被销毁(因为它不再可见)但是当用户按下以返回它时,实例将保持在周围以便轻松恢复(此时onCreateView()将再次调用它).

之后onDestroyView(),您可以(并且可能应该)释放所有View引用以允许它们被垃圾收集.在许多情况下,没有必要,就好像它只是在配置更改期间发生,onDestroy()将立即跟随并且整个实例将被垃圾收集.

从本质上讲,我认为最好释放任何和所有视图引用onDestroyView(),如果你的应用程序有一个大的backstack,可以节省相当多的内存.