Fragment缓存并防止内存泄露

  • 0x00
    今天在技术群里面遇到如下提问:
tablayout切换有什么好的办法不销毁加载好的内容吗?

一般我们使用TabLayout切换Fragment中展示内容,既然不销毁加载好的内容,那就是不销毁Fragment就能实现了。
不销毁Fragment就是对已经存在的Fragment进行缓存
传统的java方法存储一个唯一的对象采用HashMap,但是Google用SparseArray替代HashMap来提高效率。

  • 0x01 SparseArray缓存Fragment示例
public class FragmentFactory {
private static SparseArray map = new SparseArray();
public static Fragment getFragment(int position) {
Fragment fragment = null;
if (map.get(position, fragment) != null) {
return map.get(position);
}
switch (position) {
case 0:
fragment = new NewsFragment();
break;
case 1:
fragment = new ToolsFragment();
break;
case 2:
fragment = new ZhihuDailyFragment();
break;
case 3:
fragment = new AboutFragment();
break;
}
map.put(position, fragment);
return fragment;
}
}

这里是根据position进行缓存 ,position一般就是TabLayout的子Tab的序号或者ViewPager的Postion位置。

  • 0x02 内存泄露
    有人提示我,代码有内存泄露的可能性,由于这段代码使用多年并未注意到内存泄露问题,所以没有处理这个问题。由于map这个集合声明的是static,所以有内存泄露的可能性。
    解决方法:
public class FragmentFactory {
private static FragmentFactory mFactory = null;
public static FragmentFactory getInstatic() {
if (mFactory == null) {
mFactory = new FragmentFactory();
}
return mFactory;
}
public Fragment getFragment(int position) {
SparseArray map = new SparseArray();
Fragment fragment = null;
if (map.get(position, fragment) != null) {
return map.get(position);
}
switch (position) {
case 0:
fragment = new NewsFragment();
break;
case 1:
fragment = new ToolsFragment();
break;
case 2:
fragment = new ZhihuDailyFragment();
break;
case 3:
fragment = new AboutFragment();
break;
}
map.put(position, fragment);
return fragment;
}
}

你可能感兴趣的:(Fragment缓存并防止内存泄露)