Android Fragment 懒加载

懒加载

再讲懒加载之前我觉得要先回忆回忆下单例模式中有有两种方式进行 一种是饱汉式,另一种是饿汉式,而这里要讲懒加载和饱汉式一个意思,就是说需要才去加载。现在的应用ViewPage+Fragment结合搭建主体布局较多,ViewPage由于要保证滑动的流畅性,会预加载Fragment这样会导致 用户明明就想看当前的Fragment,但是由帮我们把下一页的数据加载好了,这样会浪费用户流量,应用性能会有所影响,现在就要用到懒加载我这里介绍两种方式,看你像采用哪种

ViewPage+Fragment+SimpleOnPageChangeListener 实现懒加载

就不讲解了 重要的部分 都注释了 所以直接贴代码了
BaseFragment


    public abstract class BaseFragment extends Fragment{
    public  View mView;
    public Activity mActivity;
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity=activity;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mView=inflater.inflate(getViewlayout(), container,false);
        init();
        return mView;
    }
    public abstract void init();
    public abstract void initData();
    public abstract int  getViewlayout();


}


TestFragment

public class TestFragment extends BaseFragment {
    public String msg;
    TextView mTvTest;

    public static TestFragment getInstance(String name) {
        TestFragment fragment = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("param", name);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void initData() {
        Log.i("Test", "开始加载数据");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());
        time="当前时间:" + time;
        Log.i("Test", msg+"======="+time);

    }

    @Override
    public int getViewlayout() {
        return R.layout.fragment_test;
    }

    @Override
    public void init() {
        mTvTest=(TextView) mView.findViewById(R.id.tv_test);
        msg=getArguments().getString("param");
        mTvTest.setText("当前的Fragment"+msg);
    }
} 

MainActivity

public class MainActivity extends FragmentActivity {
    private ViewPager mViewPager;
    private  List<BaseFragment> mFragment;
    private TestViewPagerAdapter mAdapter;
    private FragmentManager mFragmentManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager=(ViewPager) this.findViewById(R.id.viewpager);

        init();
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                mFragment.get(position).initData();

            }
        });

    }
   public  void init(){
       mFragment=new ArrayList<BaseFragment>();
       for(int i=0;i<4;i++){
           mFragment.add(TestFragment.getInstance("TestFragment"+i));
       }
       mFragmentManager=getSupportFragmentManager();
       mAdapter=new TestViewPagerAdapter(mFragmentManager);
       mViewPager.setAdapter(mAdapter);
       //出于Fragment和Activity 生命周期不一致考虑  执行Runnable的run() Fragment onCreateView()方法之后调用    可验证
       mViewPager.post(new Runnable() {

        @Override
        public void run() {
             mFragment.get(0).initData();//第一次加载数据
        }
    });


   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    class TestViewPagerAdapter extends FragmentPagerAdapter{

        public TestViewPagerAdapter(FragmentManager fm) {
            super(fm);

        }

        @Override
        public Fragment getItem(int pasiton) {
            return mFragment.get(pasiton);
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mFragment.size();
        }

    }

}

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

  <android.support.v4.view.ViewPager

      android:layout_width="match_parent"
      android:id="@+id/viewpager"
      android:layout_height="match_parent"/>

</RelativeLayout>

ViewPage+Fragment+setUserVisibleHint(boolean isVisibleToUser)实现懒加载

BaseFragment 
public abstract class BaseFragment extends Fragment {
    public String msg;
    public View mView;
    public Activity mActivity;
    private boolean mIsCreateView=false;
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mIsCreateView=true;
        mView = inflater.inflate(getViewlayout(), container, false);
        init();
        lazyLoadData();
        return mView;
    }
    //用户可见调用的方法  注意该方法会多次调用针对于同一个fragment而言    该方法 甚至在oncreate()调用之前调用  这点一定要注意, 但是 isVisibleToUser 为true  这该fragment 对于用户可见 
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        lazyLoadData();
    }
    private  void  lazyLoadData(){
        if(getUserVisibleHint()&&mIsCreateView){
            initData();
        }
    }
     @Override
    public void onDestroyView() {
        super.onDestroyView();
        mIsCreateView=false;
    }
    //初始化变量
    public abstract void init();
    //初始化数据
    public abstract void initData();
   //初始化布局文件
    public abstract int getViewlayout();

}

MainActivity

public class MainActivity extends FragmentActivity {
    private ViewPager mViewPager;
    private  List<BaseFragment> mFragment;
    private TestViewPagerAdapter mAdapter;
    private FragmentManager mFragmentManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager=(ViewPager) this.findViewById(R.id.viewpager);
        init();

    }
   public  void init(){
       mFragment=new ArrayList<BaseFragment>();
       for(int i=0;i<4;i++){
           mFragment.add(TestFragment.getInstance("TestFragment"+i));
       }
       mFragmentManager=getSupportFragmentManager();
       mAdapter=new TestViewPagerAdapter(mFragmentManager);
       mViewPager.setAdapter(mAdapter);


   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    class TestViewPagerAdapter extends FragmentPagerAdapter{

        public TestViewPagerAdapter(FragmentManager fm) {
            super(fm);

        }

        @Override
        public Fragment getItem(int pasiton) {
            return mFragment.get(pasiton);
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mFragment.size();
        }

    }

}

至于布局文件 和测试Fragment 代码我就不贴了 和上面的都是第一种一样的实现懒加载一样的
### 总结
突然想写一篇关于懒加载的博客 是因为最近看这样的博客有很多 就根据看博客 自己也来写写看看,至于大家要选用那种看项目需求吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值