- 0x00
今天在技术群里面遇到如下提问:
tablayout切换有什么好的办法不销毁加载好的内容吗?
一般我们使用TabLayout切换Fragment中展示内容,既然不销毁加载好的内容,那就是不销毁Fragment就能实现了。
不销毁Fragment就是对已经存在的Fragment进行缓存
传统的java方法存储一个唯一的对象采用HashMap,但是Google用SparseArray替代HashMap来提高效率。
public class FragmentFactory {
private static SparseArray<Fragment> map = new SparseArray<Fragment>();
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<Fragment> map = new SparseArray<Fragment>();
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;
}
}