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

时间:2014-10-14 20:41:36

标签: android android-activity android-fragments ondestroy

我正在阅读 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();
}

在此函数中,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();
}

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

我的问题是

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

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

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

    感谢您的想法!

3 个答案:

答案 0 :(得分:57)

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

onDestroy()
onCreate()
对于相同的Activity实例,

永远不会按顺序发生。对于片段,以下内容完全有效:

onCreate()
onCreateView()
onDestroyView()
onCreateView()
onDestroyView()
onDestroy()

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

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

基本上,我认为在onDestroyView()中发布任何和所有视图引用都是一种好习惯,如果你的应用程序有大量的后端堆栈,可以节省相当多的内存。

答案 1 :(得分:0)

从API 19开始,无需在onDestroy()onDestoryView()中注销监听器,而在onStop()中取消注册click events automatically canceled

并且无需将视图设置为null。使用Jetpack的ViewBinding

因此,在大多数情况下,您无需在片段中实现onDestroyView()。有关更多信息,请参阅有关Android Fragment Lifecycle的博客文章。只需137秒。

答案 2 :(得分:-1)

如果不影响应用程序的逻辑,则无需设置null。例如。 if(mList == null)...