片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

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 不像片段、活动或线程那样拥有自己的生命周期。当片段被销毁时,所有相关的OnItemClickListeners 都将被销毁。

【讨论】:

【参考方案3】:

在将内部类实例传递给其他线程之前,您不应该担心内存泄漏,该线程有自己的生命周期。 如果您需要这样做,只需创建一个静态内部类并将 WeakReference 传递给宿主片段/活动/任何东西。

【讨论】:

以上是关于片段 - 全局视图变量与本地和内部类侦听器和内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存??

python函数中局部变量与全局变量遵守规则

变量与存储空间及其存储结构

js全局变量优点和缺点

全局变量和局部变量的区别