从视图android中删除所有侦听器

时间:2017-09-14 19:13:16

标签: java android android-layout memory-leaks

为了避免内存泄漏,我想从android视图中删除所有监听器和观察者。对于TextWatcher,我知道我必须在数据结构中保存addTextChangedListener()添加的每个引用,然后使用removeTextChangedListener()将其删除(在onDestroy中)。但对于视图的其他侦听器,是否有一种方法可以将它们全部设置为null。 到目前为止,我一直在我的大多数视图中使用它(编辑:所有已分配任何侦听器的视图;此外,在onDestroy()和/或onDestroyView()中调用此视图,具体取决于情况下):

 public static  void releaseView(View view){
        if(view != null ){
            view.removeCallbacks(null);
            if(!(view instanceof AdapterView)) {
                view.setOnClickListener(null);
                view.setOnTouchListener(null);
                view.setOnLongClickListener(null);
                view.setOnDragListener(null);
                view.setOnFocusChangeListener(null);
                view.setOnKeyListener(null);

                if (view instanceof TextView) {
                    ((TextView) view).setOnEditorActionListener(null);
                    ((TextView) view).setKeyListener(null);


                    if(view instanceof CheckBox)
                        ((CheckBox) view).setOnCheckedChangeListener(null);
                }
            }
            else {
                if (view instanceof ListView) {
                    ((ListView) view).setOnItemClickListener(null);
                    ((ListView) view).setOnItemLongClickListener(null);
                    ((ListView) view).setOnItemSelectedListener(null);
                    ((ListView) view).setOnScrollListener(null);
                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) //if Marshamallow => API 23
                        ((ListView) view).setOnScrollChangeListener(null);
                    ((ListView) view).setAdapter(null);
                    //return;
                }

                if (view instanceof Spinner) {
                    ((Spinner) view).setOnItemSelectedListener(null);
                    //return;
                }

                if (view instanceof GridView) {
                    ((GridView) view).setOnItemSelectedListener(null);
                    ((GridView) view).setAdapter(null);                       
                }
            }          
        }
    } 

然而,我仍然得到一些被这种方法泄露的观点。有什么我想念的吗?如果我在这里犯了错误,有人可以纠正我。

2 个答案:

答案 0 :(得分:0)

在Android中,默认情况下,几乎所有视图中的侦听器都为null,直到初始化任何一个。

因此设置null是绝对不必要的

为什么你认为存在内存泄漏。有错误日志吗?

答案 1 :(得分:0)

通常,侦听器不会导致任何内存泄漏,除非您创建或操纵它们不正确,以便它们在内存中创建任何循环或循环引用。可以找到更多信息https://docs.microsoft.com/en-us/outlook/add-ins/addin-tutorial

如果您正确创建和/或使用侦听器,则永远不需要不必要地删除侦听器。

进一步建议通过here!为了进一步的帮助。