多fragment内存优化

类似新闻内容页,viewpager加载多个fragment并且经常切换的需求,这种情况下的内存需要特别注意,一不小心处理不当很容易出现内存暴涨,频繁触发gc页面卡顿,甚至oom的情况,针对这种需求总结下面几点注意事项

注意事项

1.采用FragmentStatePagerAdapter
    FragmentStatePagerAdapter和FragmentPagerAdapter的主要区别是:
        FragmentStatePagerAdapter会及时回收fragment
        而FragmentPagerAdapter会把fragment一直放在内存当中
    那么在当前需求下肯定是要用FragmentStatePagerAdapter比较合适
2.FragmentStatePagerAdapter设置contentVp.setOffscreenPageLimit(1);
    这个设置是防止viewpager缓存过多的fragment但是不用设置成0
    因为设置0默认最小值1
3.懒加载的问题上一篇说过了:
    https://blog.csdn.net/random_7474/article/details/81205513
4.需要特别注意的一点,虽然很小的细节但是坑了我足有两天···
    我们通常喜欢把所有的Fragment new出来然后放在一个list里面
    在adapter的getItem(int position)的时候在用list.get(position)来返回fragment
    在这个需求下面是不行的,会导致fragment无法回收一直占用内存,我现在的方案是:
    在adapter的getItem(int position)的时候直接return NewsContentFragment.getInstance()
    也就是直接new
当前方案解决了问题,内存中只存在3个NewsContentFragment,并且配合懒加载不会加载下一个fragment的数据
贴一下我的fragmentStatePagerAdapter的源码
package com.maiku.news.ui.main.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;

import com.maiku.news.bean.NewsCategoryBean;
import com.maiku.news.ui.news.fragment.NewsContentFragment;

import java.util.List;

/**
 * Created by txw_pc on 2018/6/4.
 */

public class MainNewsViewPagerAdapter extends FragmentStatePagerAdapter{


    List<NewsCategoryBean> tabs;
    FragmentManager fm;
    NewsContentFragment currentFragment;

    public MainNewsViewPagerAdapter(FragmentManager fm, List<NewsCategoryBean> tabs) {
        super(fm);
        this.fm = fm;
        this.tabs = tabs;

    }

    @Override
    public Fragment getItem(int position) {
        boolean isFirstFragment = position == 0;
        NewsContentFragment fragment = NewsContentFragment.getInstance(tabs.get(position).getName(),tabs.get(position).getId(), isFirstFragment);
        return fragment;
    }

    @Override
    public int getCount() {
        return tabs == null ? 0:tabs.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabs.get(position).getName();
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem(container, position, object);
        currentFragment = (NewsContentFragment) object;
    }

    public NewsContentFragment getCurrentFragment(){
        return currentFragment;
    }

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值