我的Android成长之路——Fragment

我的Android成长之路——Fragment1..Fragment相关知识点生命周期Fragment的使用:静态、动态Fragment应注意到的问题……在这里就不详细介绍了,想了解

大家好,欢迎来到IT知识分享网。

1..Fragment相关知识点

  • 生命周期

  • Fragment的使用:静态、动态

  • Fragment应注意到的问题

  • ……

在这里就不详细介绍了,想了解的可以看我的这篇文章:

你真的会用Fragment了么?-Fragment解析

1.Fragment使用场景

我们可以看到市场的APP一般都是用底部Tab+fragment切换为整体架子的,或者通过viewpager作为容器嵌套fragment,再复杂点的就是fragment嵌套fragment,某书、某条等等都是这样;

2.遇到的问题

这样的话我们遇到的问题就是当fragment很多组合使用的时候,每个fragment里面都会加载数据或者执行动画等比较复杂的业务逻辑时,导致我们的APP进入时屏幕卡顿,性能很差,一点都不流畅。即便是我们在使用viewpager作为容器的时候设置预加载setOffscreenPageLimit()这个方法,其实你会发现根本不会起作用。

至于viewpager这个预加载方法为什么不行?我们可以看一下viewpager源码:

我的Android成长之路——Fragment

我们可以看到DEFAULT_OFFSCREEN_PAGES 这里就定义了默认值是1,如果你调用该方法传进来的值小于1是无效的,会被强行的拽回1。而且DEFAULT_OFFSCREEN_PAGES 这个值是private的,子类继承ViewPager也是不可见的。

网上有的说可以将viewpager的源码复制下来粘到自己的类里面将这个默认值改为0,这个目前还没试过,即使可以感觉也有些别扭,更何况我们使用场景也不一定需要viewpager呢

2.Fragment懒加载

这是靠Fragment里有一个setUserVisibleHint(boolean isVisibleToUser)的方法,我们可以在这个方法里做判断,当其True可见时(即切换到某一个具体Fragment)时才去加载数据,这样可以省流量。

具体怎么去操作呢?

  • 预加载初始化数据和组件等轻量操作

  • 切换tab到第一次可见时执行网络请求

  • 四种状态:第一次可见状态、可见状态、第一次不可见状态、不可见状态

  • 销毁时处理解注册、销毁广播等问题

3.BaseFragment封装

1.初始化xml文件

@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (getContentViewLayoutID() != 0) { return inflater.inflate(getContentViewLayoutID(), null); } else { return super.onCreateView(inflater, container, savedInstanceState); } } protected abstract int getContentViewLayoutID();

2.注解绑定以及初始化组件

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this,view); initViewsAndEvents(view); } protected abstract void initViewsAndEvents(View view);

3.四种“见”的状态拆分

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initPrepare(); } private synchronized void initPrepare() { if (isPrepared) { onFirstUserVisible(); } else { isPrepared = true; } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (isFirstVisible) { isFirstVisible = false; initPrepare(); } else { onUserVisible(); } } else { if (isFirstInvisible) { isFirstInvisible = false; onFirstUserInvisible(); } else { onUserInvisible(); } } } protected abstract void onFirstUserVisible(); protected abstract void onUserVisible(); private void onFirstUserInvisible() { } protected abstract void onUserInvisible();

4.最后解注册销毁等工作

@Override public void onDestroy() { DetoryViewAndThing(); super.onDestroy(); } protected abstract void DetoryViewAndThing();

5.跳转界面等方法

/** * 打开一个Activity 默认 不关闭当前activity */ public void gotoActivity(Class<?> clz) { gotoActivity(clz, false, null); } public void gotoActivity(Class<?> clz, boolean isCloseCurrentActivity) { gotoActivity(clz, isCloseCurrentActivity, null); } public void gotoActivity(Class<?> clz, boolean isCloseCurrentActivity, Bundle ex) { Intent intent = new Intent(mActivity, clz); if (ex != null) intent.putExtras(ex); startActivity(intent); if (isCloseCurrentActivity) { mActivity.finish(); } }

最后提一个小问题吧:就是说如果你没有用Fragment懒加载的话而是用的viewpager的预加载,如果你没有自己定义默认预加载个数的话,那么默认肯定是会提前加载的,加入你当前fragment相邻的fragment里面有动画或者视频播放的话,切换到当前fragment时候下个fragment里面的动画或者视频就已经开始执行了,注意一下。

到此我的base就告一段落了,很多不合理的地方,我接下来私下也会去听取小伙伴们的意见进行修改,然后最后在HLibrary里面贴出来的,非常感谢大家。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/54626.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信