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
- Android Fragment 懒加载
- android Fragment 懒加载布局
- Android之Fragment懒加载
- Android Fragment实现懒加载
- Android之Fragment懒加载
- Android Fragment 实现懒加载
- Android ViewPager + Fragment懒加载
- 关于android Fragment懒加载
- Android 实现fragment懒加载
- Android开发技巧-Fragment的懒加载
- 浅析:Android--Fragment的懒加载
- android——Fragment实现懒加载
- Android ViewPager + Fragment 懒加载处理
- android ViewPager+Fragment之懒加载
- Android之Fragment懒加载分析
- Android开发之Fragment懒加载技术
- Android Fragment(生命周期+懒加载)
- Android高级----Fragment的懒加载
- 关于Machine Learning中Bias与Variance的整理与总结
- Getting started with Yocto on Wandboard(in China)
- Android开发从入门到放弃(3)使用SharedPreferences保存数据
- 算法 连续邮资问题
- 数据库传入中文乱码
- Android Fragment 懒加载
- 二分查找套路
- 【气球】关于气球动力与控制的设想
- 专题3-ARM汇编指令详解
- CUDA总结:opencv cuda模块高斯滤波函数分析
- 斐波拉契数列
- Webpack-模块化系统简述
- ionic2混合app开发系列1-环境搭建和ionic2项目目录介绍
- 回首2016,展望2017