片段 - 全局视图变量与本地和内部类侦听器和内存泄漏
Posted
技术标签:
【中文标题】片段 - 全局视图变量与本地和内部类侦听器和内存泄漏【英文标题】:Fragment - Global view variable vs local and inner class listeners and memory leak 【发布时间】:2016-03-02 22:04:46 【问题描述】:假设考虑以下两个不同的定义;
全局变量一;
View mainView;
ListView categoryList;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
mainView = inflater.inflate(R.layout.fragment_expense_add,container,false);
return mainView;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
categoryList = (ListView) mainView.findViewById(R.id.categoryList);
categoryList.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
catListAdapter.updateRadioButtons(position);
if(amount.hasFocus())
((MainActivity)getActivity()).hideKeyboard();
);
本地人
Listview categoryList = (ListView) mainView.findViewById(R.id.categoryList);
categoryList.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
catListAdapter.updateRadioButtons(position);
if(amount.hasFocus())
((MainActivity)getActivity()).hideKeyboard();
);
哪一种更能防止内存泄漏?
如上所示定义内部类触摸侦听器是否安全,例如项目点击侦听器?当我的片段被销毁时,它是否仍然引用它?如何避免内存泄漏?
【问题讨论】:
【参考方案1】:变量是局部变量还是成员变量没有区别。根据经验,如果您只需要特定方法中的变量,请将其设置为该方法的本地变量(始终使用尽可能小的范围)。
内部类适用于小方法,但对于较大的方法,请创建成员变量或类以保持代码更简洁。
上面显示的代码没有泄漏。
【讨论】:
【参考方案2】:这取决于你的片段是否被保留。如果它被保留(我的意思是setRetainInstance(true);
),那么您只需要确保您的片段没有引用外部Activity
及其在片段分离时的视图。
如果片段没有被保留,那么你就不用担心了。 OnItemClickListener
不像片段、活动或线程那样拥有自己的生命周期。当片段被销毁时,所有相关的OnItemClickListener
s 都将被销毁。
【讨论】:
【参考方案3】:在将内部类实例传递给其他线程之前,您不应该担心内存泄漏,该线程有自己的生命周期。 如果您需要这样做,只需创建一个静态内部类并将 WeakReference 传递给宿主片段/活动/任何东西。
【讨论】:
以上是关于片段 - 全局视图变量与本地和内部类侦听器和内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量