我正在阅读 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类所做的那样。
我的问题是
为什么谷歌开发者没有在ListActivity的onDestroy中将Null设置为mList?有什么理由吗?
我们是否需要将Null设置为Activity的onDestroy和Fragment的onDestroyView中的所有View字段?
第3。在这两个函数中设置Null的任何做法:Activity的onDestroy和Fragment的onDestroyView?
感谢您的想法!
答案 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)...