美文网首页
Fragment缓存并防止内存泄露

Fragment缓存并防止内存泄露

作者: h4de5 | 来源:发表于2017-01-09 13:46 被阅读382次
    • 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;
    }
    }
    

    相关文章

      网友评论

          本文标题:Fragment缓存并防止内存泄露

          本文链接:https://www.haomeiwen.com/subject/alocbttx.html