这是我前段时间遇到的两个问题,状况是这样的:第一个问题:因为公司的 app 层级比较多,因此用了一个翻页的功能。在具体翻到某一页的时候,咱们须要更新当前页的完成时间,可是当我开发的时候发现翻到当前页的时候也会更新下一页的时间。经过调试,发现当我进入页面的时候 Fragment 会执行两次,至关于进入当前页面后会预加载下一页的内容。后来经过了解 Android 的 ViewPager 与 Fragment 发现系统会默认预加载功能,并且默认的数值是 2. 这让我好像找到了解决的办法,经过查找,我发现有一个方法 setOffscreenPageLimit(int limit) 能够设置预加载的数量,当我调用此方法,给 limit 赋值为 0 时发现不起做用,后来看了一下 ViewPager 的源码: private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES , 默认值是 1, 咱们来看看 setOffscreenPageLimit(int limit) 方法的源码:java
public void setOffscreenPageLimit(int limit) { if (limit < DEFAULT_OFFSCREEN_PAGES) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } }
在打印日志里面的语句就能够看到,若是 limit 小于默认值 1,limit 的值仍是被设置成了 1,因此至关于系统老是会默认预加载下一页的内容,这样要取消预加载这个方法怎么都无论用了。彷佛惟一的解决办法是修改源码的DEFAULT_OFFSCREEN_PAGES 值为 0,而后再从新打包放到本身的项目中。这样当然能够解决问题,但是是否还有其它的解决办法?我是这样的解决的:在 Fragment 里面实现一个接口,而后在 ViewPager 里面注册 setOnPageChangeListener 事件,在事件的 onPageSelected(int arg0) 方法里面添加更新时间的代码,这样当翻页时就会调用注册事件里面的 onPageSelected(int arg0) 方法,就能够只更新当前页的时间了。想法当然很好,可是新的问题又来了。app
问题之二:当我运行时总会出现空指针异常,经过调试,我发现更新时间代码里面调用的 Fragment 成员变量值都为 null,难道翻页时都会首先销毁 Fragment,而后再从新 new 出一个对象?Android 彷佛就是这么作的,因此,在调用 Fragment 里面实现的那个接口方法时,不该该调用 Fragment 对象里面的成员变量,解决方法之一是把要使用到的成员变量保存在用到 ViewPager 的 Activity 里面。方法之二:Fragment虽然有onResume和onPause的,可是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法:ide
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { //至关于Fragment的onResume } else { //至关于Fragment的onPause } }
当 isVisibleToUser 这个参数为true时,说明这个Fragment已经在你的眼前了,这时你再去加载你须要的数据或者更新数据就能够了。spa