Fragment懒加载详解

来源:互联网 发布:中国宇航出版社 知乎 编辑:程序博客网 时间:2024/06/18 08:27


fragment懒加载,已经被使用烂了。我一直不是很喜欢使用,至少大多数情况下是这样的。因为随着现在手机内存越来越大了(谷歌说:内存放在那你不用,是不是傻),就不需要使用了。当然这个并不是绝对的,如果你是加载一些文本的情况下,我不建议使用懒加载,谷歌默认会为你预加载前后两页是有一定道理的,这样用户不会因为请求网络而导致延时的情况,而且保存之后,用户在短时间断网的情况下是有数据的,这样用户体验较好,如果不去缓存就很尴尬。如果你的页面如同淘宝一样有大量的图片事实上懒加载会非常适合你。所以先总结一下,懒加载适合大量图片的页面,这样可以有效节省内存的开支。而图片占的比较少或者没有的情况下我们完全不需要使用懒加载,这样不会导致因为网络延迟导致的尴尬情景。根据Fragment生命周期我们的Fragment如下,其他fragment均一样。

package websocket.yuriko.com.viewpager_fragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/** * Created by Administrator on 2016/11/30. */public class Fragment1 extends Fragment {    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i("fragment1", "Fragment1_onCreate");    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        Log.i("fragment1", "Fragment1_onCreateView");        TextView textview=new TextView(getActivity());        textview.setText("Fragment1");        textview.setTextSize(18);        return textview;    }    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(getUserVisibleHint()){            Log.i("getUserVisibleHint1", "setUserVisibleHint1");        }    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        Log.i("fragment1", "fragment1_onActivityCreated");        super.onActivityCreated(savedInstanceState);    }    @Override    public void onStart() {        super.onStart();        Log.i("fragment1", "fragment1_onStart");    }    @Override    public void onResume() {        super.onResume();        Log.i("fragment1", "fragment1_onResume");    }    @Override    public void onPause() {        super.onPause();        Log.i("fragment1", "fragment1_onPause");    }    @Override    public void onStop() {        super.onStop();        Log.i("fragment1", "fragment1_onStop");    }    @Override    public void onDestroyView() {        super.onDestroyView();        Log.i("fragment1", "fragment1_onDestroyView");    }}


 懒加载的使用:


我们先看图。第一张图初始化页面的时候我们可以看到Fragment1和Fragment2都到达了onResume。没错,事实上他们都呈现给了用户,但是我们只看到了Fragment1。这种情况类似于一摞扑克牌一样,事实上adapter就是这样的,而且adapter还是倒序的,这个后续说。此时Fragment1的setUserVisibleHint()方法已经被调用了。

我们再看这张图。我们从Fragment1滑动到Fragment2时我们的Fragment3被创建了,Fragment2的setUserVisibleHint()方法同样也被调用了。

这是第三张图,我们从Fragment2滑动到Fragment3,我们很清楚的看到Fragment执行了onDestroyView()方法,说明Fragment1消失了。

我们再看最后一张图,从Fragment3回到Fragment2,Fragment1出现了、Fragment2的setUserVisibleHint()方法也被调用了,这好像都没问题,但是我们发现Fragment2并没有执行创建的功能,对,你没有看错,Fragment2确实没有执行创建的功能,这意味着如果我们需要在setUserVisibleHint()方法里面加上创建所有的控件包括根布局等等,还有各种控件的事件绑定,然而我们只能这么做。


对于Fragment的抽象目前网上很多都是这样写的,我也就拿来主义的用一下,只要注意在setUserVisibleHint()方法中进行初始化控件即可。

import android.support.v4.app.Fragment;/** * Created by Administrator on 2016/12/5. */public abstract class LazyFragment extends Fragment {    protected boolean isVisible;    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(getUserVisibleHint()) {            isVisible = true;            onVisible();        } else {            isVisible = false;            onInvisible();        }    }    protected void onVisible(){        //实现数据加载和控件绑定        lazyLoad();    }    protected abstract void lazyLoad();    protected void onInvisible(){}}



0 0
原创粉丝点击