Android中Fragment的懒加载

来源:互联网 发布:ipad有淘宝卖家版吗 编辑:程序博客网 时间:2024/05/19 06:17

在大部分安卓APP开发中都会用到ViewPager和Fragment的结合使用,而ViewPager又会出现预加载的情况,比如说打开app时第一个fragment和第二个fragment已经加载好了,当滑动到第二个fragment的时候第三个fragment已经加载好了,我们大多时候都希望当滑动到哪一页就加载哪一页,这样性能比较好也比较省流量,因此需要一个方法来解决这个问题。

BaseFragment中

import android.support.v4.app.Fragment;/** * Created by AZ001 on 2017/7/6. */public class BaseFragment extends Fragment {    protected boolean mIsVisible = false;    /**     * 在这里实现懒加载.     */    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (getUserVisibleHint()) {            mIsVisible = true;            onVisible();        } else {            mIsVisible = false;            onInvisible();        }    }    protected void onInvisible() {    }    /**     * 显示时加载数据,需要这样的使用     * 注意声明 isPrepared,先初始化     * 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated     * 在 onActivityCreated 之后第一次显示加载数据,只加载一次     */    protected void loadData() {    }    protected void onVisible() {        loadData();    }}

在setUserVisibleHint中判断当前界面是否展示在用户面前,如果是那么执行onVisible()方法,否则执行onInvisible()方法


FirstPageFragment

import android.os.Bundle;import android.support.annotation.Nullable;/** * Created by AZ001 on 2017/7/6. */public class FirstPageFragment extends BaseFragment {    private boolean isPrepared = false;    private boolean isFirst = true;    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        isPrepared = true;        //loadData的执行比onActivityCreated快,所以要保证onActivityCreated执行过,再去执行loadData方法,初始化完成后才能执行loadData方法        //比如当打开有4个fragment的界面的时候,第一个fragment执行了loadData方法但是还没有初始化,所以不能执行isParepared为false,        //然后第一个界面和第二个界面的onActivityCreated已经先执行了,(这里setOffscreenPageLimit方法设置的数量为默认的)此时isPrepared为true。        //然后需要手动的去执行loadData方法(因为loadData已经执行了一次之前)。当切换到第二个界面的时候,由于onActivityCreated已经执行过了,初始化已经做好了,那么        //BaseFragment 中的onVisible方法会执行,随后子Fragment中的loadData方法执行了,就不会出现第一个界面打开时的情况        loadData();    }    @Override    protected void loadData() {        //只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求        if (!mIsVisible || !isPrepared || !isFirst) {            return;        }        //其他操作    }}

SecondPageFragment

import android.os.Bundle;import android.support.annotation.Nullable;/** * Created by AZ001 on 2017/7/6. */public class SecondPageFragment extends BaseFragment {    private boolean isPrepared = false;    private boolean isFirst = true;    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        isPrepared = true;        //viewpager的预加载会先执行此方法    }    @Override    protected void loadData() {        //只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求        if (!mIsVisible || !isPrepared || !isFirst) {            return;        }        //其他操作    }}

在loadData方法中去请求数据,同时要判断是否展示当前界面,是否已经初始化了,是否已经执行过请求不用每次显示界面都去请求数据。