关闭

fragment懒加载

130人阅读 评论(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
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Andriod开发技巧——Fragment的懒加载

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在...
  • maosidiaoxian
  • maosidiaoxian
  • 2014-07-30 15:48
  • 66410

Fragment实现懒加载,让应用更优化

一.概述玩过微信的都知道,微信用的是懒加载的模式,之所以使用懒加载是因为:当使用viewpager+adapter作为应用大的布局时,viewpager会通过setOffscreenPageLimit...
  • Mr_immortalZ
  • Mr_immortalZ
  • 2016-03-30 15:27
  • 7062

Android开发之Fragment懒加载技术

本文介绍一下fragment的懒加载技术,使代码的性能与质量进一步提供,下面请看文章!
  • itluochen
  • itluochen
  • 2016-08-11 17:55
  • 2182

Fragment懒加载

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在...
  • qibanxuehua
  • qibanxuehua
  • 2015-07-30 10:59
  • 3375

对ViewPager+Fragment的懒加载的小小探究

在网上搜索了一些ViewPager+Fragment懒加载的实现方法,基本都是利用setUserVisibleHint()方法中判断当前fragment是否可见,可见则执行加载操作。懒加载frgmen...
  • Jali_li
  • Jali_li
  • 2016-04-29 10:22
  • 1479

Android ViewPager Fragment使用懒加载提升性能

Android ViewPager Fragment使用懒加载提升性能Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Android ...
  • zhangphil
  • zhangphil
  • 2016-11-17 16:59
  • 2628

Android Fragment(生命周期+懒加载)

以前面试的时候吧,能把Fragment的生命周期从头到尾背一遍,然后懒加载也是知道怎么实现,但是呢,没有写过demo具体研究过,于是就准备写篇博客就当笔记了。 先附上一张面试时候常考的一张Fragm...
  • vv_bug
  • vv_bug
  • 2016-09-21 18:01
  • 2004

Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

在Android中我们经常会用到ViewPager+Fragment组合。然而,有一个很让人头疼的问题就是,我们去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个。这让...
  • u010785585
  • u010785585
  • 2016-11-17 19:59
  • 18214

面试总结(5):Fragment的懒加载

前言在我们的项目里经常会用到ViewPager+Fragment实现选项卡滑动切换的效果,ViewPager会预加载下一个Framgment的内容,这样的机制有优点也有缺点: 预加载让用户可以更快...
  • u011315960
  • u011315960
  • 2017-05-08 12:03
  • 299

tablayout+viewpager+fragment组合使用以及懒加载机制

在开发中经常用到TabLayout+ViewPager+Fragment的组合。如下图所示: 首先介绍一下使用方法: xml文件 1 2 3 4 5 6 7 8 9 ...
  • xjbclz
  • xjbclz
  • 2016-11-05 18:16
  • 3494
    个人资料
    • 访问:376次
    • 积分:45
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档