标签/片段和内存泄漏

时间:2013-03-16 21:11:50

标签: android memory-leaks

我正在开发一个应用程序(不是由我编写的),它有一个由三个选项卡组成的活动,每个选项卡对应于它自己的片段(我之前从未使用过片段)。每个选项卡/片段显示消耗大量内存的数据结构。我想确信当我从一个选项卡切换到另一个选项卡时,传出选项卡/片段所占用的内存已完全释放。在下一个启动之前。

所以说例如传出片段显示了一个位图 - 是否必须先执行bitmap.release()以确保片段释放所有内存?

1 个答案:

答案 0 :(得分:0)

在标签控制器上监听标签更改事件。

tabLayout.setOnTabChangedListener(<listener>);

在侦听器(onTabChanged(int index, boolean isUserInput))的回调方法上,获取前一个片段,以递归方式在其视图上调用unbind drawable(你需要编写它)。执行此操作后,您还可以调用System.gc()来提示Dalvik VM运行垃圾收集器(只是一个提示,不保证)。

取消绑定的示例代码:

public static void unbindDrawables(@Nullable View view) {
    if (view == null) {
        return;
    }

    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }

    if (view instanceof ImageView && ((ImageView) view).getDrawable() != null) {
        ((ImageView) view).getDrawable().setCallback(null);
    }

    if (view instanceof ViewGroup) {
        if (view instanceof AbsListView) {
            // Clean out list view
            List<View> cells = Lists.newLinkedList();
            ((AbsListView) view).reclaimViews(cells);
            if (cells != null) {
                for (View c : cells) {
                    unbindDrawables(c);
                }
            }
        } else {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        }
    }
}