美文网首页
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缓存并防止内存泄露

    0x00今天在技术群里面遇到如下提问: 一般我们使用TabLayout切换Fragment中展示内容,既然不销毁加...

  • Android RxLifecycle基本使用及原理

    github地址:https://github.com/trello/RxLifecycle 作用:防止内存泄露。...

  • Java防止内存泄露

    启用JMS进行监控采集数据 [https://note.youdao.com/md/?defaultMode=vi...

  • 如何防止内存泄露

    注意集合类:如HashMap、ArrayList等,当他们被声明为静态时,他们的生命时间与应用程序的生命时间是相同...

  • Glide 面试题

    1. 简单介绍一下Glide缓存 Glide 缓存机制主要分为2种:内存缓存和磁盘缓存使用内存缓存的原因是:防止应...

  • java垃圾回收算法

    垃圾回收机制的意义 垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存;内存泄露:指该内存空间使用完毕后未回收,...

  • Glide学习归纳二 缓存管理

    Glide的缓存分成两个缓存,一个是内存缓存,一个是磁盘缓存 内存缓存的主要作用是防止应用重复将图片数据读取到内存...

  • 最近最少使用算法 - LruCache

    简介 我们在做图片三级缓存时,内存缓存为了防止内存溢出,导致APP崩溃,使用LruCache来管理内存...

  • SDWebImage框架的基本使用

    基本使用 1)下载图片并显示(内存缓存&磁盘缓存) 2)下载图片显示并计算下载进度(内存缓存&磁盘缓存&下载进度)...

  • APP开发实战123-APP防止OOM

    0.3.3防止OOM 1 如作到了有效节省内存和防止内存泄露,那就极大降低了OOM发生的概率。 2 不要加载过大的...

网友评论

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

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