Android Fragment 懒加载

来源:互联网 发布:海信网络 经理 张四海 编辑:程序博客网 时间:2024/05/27 16:43

懒加载

再讲懒加载之前我觉得要先回忆回忆下单例模式中有有两种方式进行 一种是饱汉式,另一种是饿汉式,而这里要讲懒加载和饱汉式一个意思,就是说需要才去加载。现在的应用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