我正在开发一个应用程序(不是由我编写的),它有一个由三个选项卡组成的活动,每个选项卡对应于它自己的片段(我之前从未使用过片段)。每个选项卡/片段显示消耗大量内存的数据结构。我想确信当我从一个选项卡切换到另一个选项卡时,传出选项卡/片段所占用的内存已完全释放。在下一个启动之前。
所以说例如传出片段显示了一个位图 - 是否必须先执行bitmap.release()以确保片段释放所有内存?
答案 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));
}
}
}
}