关闭

fragment懒加载

64人阅读 评论(0) 收藏 举报
分类:

当可见的时候加载  不可见的时候不加载


public abstract class BasicFragment extends Fragment implements FragmentUserVisibleController.UserVisibleCallback{


    private FragmentUserVisibleController fragmentUserVisibleController;


    public BasicFragment() {
        fragmentUserVisibleController = new FragmentUserVisibleController(this,this);
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        fragmentUserVisibleController.activityCreated();
    }


    @Override
    public void onResume() {
        super.onResume();
        fragmentUserVisibleController.resume();
    }


    @Override
    public void onPause() {
        super.onPause();
        fragmentUserVisibleController.pause();
    }



protected abstract void lazyLoad();


/**
* 设置懒加载
* @param isVisibleToUser
     */
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
        fragmentUserVisibleController.setUserVisibleHint(isVisibleToUser);
}


    /**
* 内存泄露排查
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
// TODO 内存泄露排查,内存使用占满的时候,引发GC,将在这里抛出
Log.e("FINALIZE", this.getClass().getName()+"have been recycled,that's maybe memory leaked!");
}




    @Override
    public void setWaitingShowToUser(boolean waitingShowToUser) {
        fragmentUserVisibleController.setWaitingShowToUser(waitingShowToUser);
    }


    @Override
    public boolean isWaitingShowToUser() {
        return fragmentUserVisibleController.isWaitingShowToUser();
    }


    @Override
    public boolean isVisibleToUser() {
        return fragmentUserVisibleController.isVisibleToUser();
    }


    @Override
    public void callSuperSetUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    }


    @Override
    public void onVisibleToUserChanged(boolean isVisibleToUser, boolean invokeInResumeOrPause) {
if(isVisibleToUser) {
lazyLoad();
}
    }
}



/**
 * @author hush
 *         on 2016/7/29
 * 实现对懒加载的控制
 */
public class FragmentUserVisibleController {


    @SuppressWarnings("FieldCanBeLocal")
    private boolean waitingShowToUser;
    private Fragment fragment;
    private UserVisibleCallback userVisibleCallback;


    public FragmentUserVisibleController(Fragment fragment, UserVisibleCallback userVisibleCallback) {
        this.fragment = fragment;
        this.userVisibleCallback = userVisibleCallback;
    }


    public void activityCreated(){
        // 如果自己是显示状态,但父Fragment却是隐藏状态,就把自己也改为隐藏状态,并且设置一个等待显示的标记
        if(fragment.getUserVisibleHint()){
            Fragment parentFragment = fragment.getParentFragment();
            if(parentFragment != null && !parentFragment.getUserVisibleHint()){


                userVisibleCallback.setWaitingShowToUser(true);
                userVisibleCallback.callSuperSetUserVisibleHint(false);
            }
        }
    }


    public void resume(){
        if (fragment.getUserVisibleHint()) {
            userVisibleCallback.onVisibleToUserChanged(true, true);
        }
    }


    public void pause(){
        if (fragment.getUserVisibleHint()) {
            userVisibleCallback.onVisibleToUserChanged(false, true);
        }
    }


    public void setUserVisibleHint(boolean isVisibleToUser){
        if (fragment.isResumed()) {
            userVisibleCallback.onVisibleToUserChanged(isVisibleToUser, false);
        }


        if(fragment.getActivity() != null) {
            List<Fragment> childFragmentList = fragment.getChildFragmentManager().getFragments();
            if (isVisibleToUser) {
                // 将所有正等待显示的子Fragment设置为显示状态,并取消等待显示标记
                if (childFragmentList != null && childFragmentList.size() > 0) {
                    for (Fragment childFragment : childFragmentList) {
                        if (childFragment instanceof UserVisibleCallback) {
                            UserVisibleCallback userVisibleCallback = (UserVisibleCallback) childFragment;
                            if (userVisibleCallback.isWaitingShowToUser()) {
                                userVisibleCallback.setWaitingShowToUser(false);
                                childFragment.setUserVisibleHint(true);
                            }
                        }
                    }
                }
            } else {
                // 将所有正在显示的子Fragment设置为隐藏状态,并设置一个等待显示标记
                if (childFragmentList != null && childFragmentList.size() > 0) {
                    for (Fragment childFragment : childFragmentList) {
                        if (childFragment instanceof UserVisibleCallback) {
                            UserVisibleCallback userVisibleCallback = (UserVisibleCallback) childFragment;
                            if (childFragment.getUserVisibleHint()) {
                                userVisibleCallback.setWaitingShowToUser(true);
                                childFragment.setUserVisibleHint(false);
                            }
                        }
                    }
                }
            }
        }
    }


    /**
     * 当前Fragment是否对用户可见
     */
    @SuppressWarnings("unused")
    public boolean isVisibleToUser(){
        return fragment.isResumed() && fragment.getUserVisibleHint();
    }


    public boolean isWaitingShowToUser() {
        return waitingShowToUser;
    }


    public void setWaitingShowToUser(boolean waitingShowToUser) {
        this.waitingShowToUser = waitingShowToUser;
    }


    public interface UserVisibleCallback {
        void setWaitingShowToUser(boolean waitingShowToUser);
        boolean isWaitingShowToUser();
        boolean isVisibleToUser();
        void callSuperSetUserVisibleHint(boolean isVisibleToUser);
        void onVisibleToUserChanged(boolean isVisibleToUser, boolean invokeInResumeOrPause);
    }
}



fragment数据在lazyLoad里面写就可以了

such as 

/**
 * @author hush
 *         on 2016/7/23
 * example
 */
public class ExampleFragment extends BasicFragment {


    private boolean isPrepared;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }


    @Override
    protected void onPostSuccess(String result) {


    }


    @Override
    protected void opPostFailed(String result) {


    }


    @Override
    protected void lazyLoad() {
//zhelixie zheli xie  zhelixie
    }
}

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:197次
    • 积分:24
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档