fragment懒加载

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


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
    }
}

阅读更多
个人分类: android 小经验
想对作者说点什么? 我来说一句

懒加载基类Fragment

2016年11月04日 3KB 下载

没有更多推荐了,返回首页

不良信息举报

fragment懒加载

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭