懒加载
再讲懒加载之前我觉得要先回忆回忆下单例模式中有有两种方式进行 一种是饱汉式,另一种是饿汉式,而这里要讲懒加载和饱汉式一个意思,就是说需要才去加载。现在的应用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 代码我就不贴了 和上面的都是第一种一样的实现懒加载一样的
### 总结
突然想写一篇关于懒加载的博客 是因为最近看这样的博客有很多 就根据看博客 自己也来写写看看,至于大家要选用那种看项目需求吧!