我正在阅读 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();
}
在此函数中,谷歌开发人员将所有在ListFragment中声明的视图字段设置为Null,并删除回调“mRequestFocus”。在ListActivity源代码中,谷歌开发人员的实现如下:
protected ListAdapter mAdapter;
protected ListView mList;
private Handler mHandler = new Handler();
@Override
protected void onDestroy() {
mHandler.removeCallbacks(mRequestFocus);
super.onDestroy();
}
我注意到谷歌开发者在ListActivity的onDestroy方法中并没有像他们在ListFragment类中那样将mList设置为Null。
我的问题是:
为什么谷歌开发者没有在ListActivity的onDestroy方法中将mList设置为Null?有什么原因吗?
我们需要在Activity的onDestroy和Fragment的onDestroyView中将所有的View字段都设置为Null吗?
3. 在这两个函数中设置Null的任何最佳实践是什么?
感谢您的想法!
onDestroyVIEW
,因此它们只销毁 View 引用。如果您调用了setListAdapter()
,然后稍后调用getListAdapter()
,结果却是null
,那么这将是意外的行为。由于适配器不是一个昂贵的对象(除了在 setRetainInstance() 的情况下可能会泄漏活动),因此释放它没有太多好处。 - Kevin CoppockonCreateView
中绑定新的(sub)view实例时,这将取消绑定旧的(sub)view实例。在分配新值之前设置为null
是不必要的。 - John Pang