这是我前段时间遇到的两个问题,情况是这样的:第一个问题:由于公司的 app 层级比较多,所以用了一个翻页的功能。在具体翻到某一页的时候,我们需要更新当前页的完成时间,但是当我开发的时候发现翻到当前页的时候也会更新下一页的时间。通过调试,发现当我进入页面的时候 Fragment 会执行两次,相当于进入当前页面后会预加载下一页的内容。后来通过了解 Android 的 ViewPager 与 Fragment 发现系统会默认预加载功能,而且默认的数值是 2. 这让我好像找到了解决的办法,通过查找,我发现有一个方法 setOffscreenPageLimit(int limit) 可以设置预加载的数量,当我调用此方法,给 limit 赋值为 0 时发现不起作用,后来看了一下 ViewPager 的源码: private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES , 默认值是 1, 我们来看看 setOffscreenPageLimit(int limit) 方法的源码:

    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) 方法,就可以只更新当前页的时间了。想法固然很好,但是新的问题又来了。

    问题之二:当我运行时总会出现空指针异常,通过调试,我发现更新时间代码里面调用的 Fragment 成员变量值都为 null,难道翻页时都会首先销毁 Fragment,然后再重新 new 出一个对象?Android 似乎就是这么做的,所以,在调用 Fragment 里面实现的那个接口方法时,不应该调用 Fragment 对象里面的成员变量,解决方法之一是把要使用到的成员变量保存在用到 ViewPager 的 Activity 里面。方法之二:Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法:

    @Override  
    public void setUserVisibleHint(boolean isVisibleToUser) {  
        super.setUserVisibleHint(isVisibleToUser);  
        if (isVisibleToUser) {  
            //相当于Fragment的onResume  
        } else {  
            //相当于Fragment的onPause  
        }  
    }


当 isVisibleToUser 这个参数为true时,说明这个Fragment已经在你的眼前了,这时你再去加载你需要的数据或者更新数据就可以了。


转载于:https://my.oschina.net/u/1460984/blog/305240

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐