android - fragment - 全局 View 变量与本地和内部类监听器以及内存泄漏

标签 android android-fragments view memory-leaks

假设考虑以下两个不同的定义;

全局变量一;

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();
        }
    });

哪个更适合防止内存泄漏?

如上所示定义内部类触摸监听器是否安全,例如项目点击监听器?当我的 fragment 被销毁时,它是否仍然引用它?如何避免内存泄漏?

最佳答案

你的变量是局部变量还是成员变量都没有区别。根据经验,如果您只需要特定方法中的变量,请将其设为该方法的本地变量(始终使用尽可能小的范围)。

内部类适用于小方法,但对于较大的方法,请创建成员变量或类以保持代码更简洁。

您上面显示的代码没有泄漏。

关于android - fragment - 全局 View 变量与本地和内部类监听器以及内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35759079/

相关文章:

Android Studio 布局预览卡住加载

安卓 : Save fragment state and restore the view values

android - 构建器 "Command ' ['ant' , 'debug' ]' returned non-zero exit status 1"

android - 自定义 ContentProvider 建议未显示

java - 无法在 Java Android 中使用 dagger2 在 fragment 中注入(inject)依赖项

android - Iphone 与 Android 的等价物 关闭 View

oracle - ALL_PROCEDURES View 不显示 PROCEDURE_NAME

php - 在 Controller 中访问 shell 方法?蛋糕 PHP 1.3

java - 仅发布问题|应用程序 :lintVitalRelease

android - ViewPager中如何不刷新页面