Monday, July 20, 2015

Android ViewPager 预加载的研究




 这两天写个日历,我也是操了。Viewpager 的预加载是很方便的,但是,如何处理好预加载的问题的确是很头疼的问题。因为,有的时候你需要去刷新当前的界面的时候,你获取不到,当前显示的Fragment or View. So 你就没有办法操作了。日历就是这么要求的!

简单介绍几个方法:
1 cardPagerViewFragment.getUserVisibleHint()

源码介绍说显示当前的可见的View or fragment.
我们都知道ViewPager 预加载的生命周期,不知道的话一会介绍!卧槽,直接返回的是下一个fragment的 VisibleHint()

如图: you can see this case: i only scroll a viewpager.
when iscroll to page=1 the 1page return false; 2 page return ture; because the ViewPager preLoad the next page!

2 简单的介绍一下Viewpager 加载Fragment 的生命周期,我用的是V4的FragmentActivty  FrgamenStatePagerAdapter.

 2.1一开始初始化的时候:预加载第一和第二个Frgament

 开始的时候加载了两个Fragment.这就是预加载的问题。

 2.2当你从第0页滑到第1页的时候:
 这个时候我们看到了 2 已经加载。我们在所有的语言中,index 都是从0开始计算的。所以,这里其实加载的是第三页的内容。所以,这个时候你去调用Adapter,getCurrentItem()
返回的Fragment 和View 的对象,都是第三页的对象实体。所以,一切方法获取到的都是不对的对象(都是下一页的对象实体)。

 2.3从第1页滑到第2页。



 首先,释放了Page0的资源。 然后创建 Page3 的页面的内容。

 2.4 从第2页滑动到第1页
 首先释放了Pager 3 也面的内容。然后去加载 Page1 的内容。

2.5 从0 --->  1页面 的时候

这个时候,内存释放了Page 2 的内容。

2.6 0 退出的时候。

先释放 1 的资源。
再释放 0 的资源。

到这里我们已经很了解 ViewPager 的预加载;


3  the source sayL the method can limit the  prepage of Viewapger.然而并没有什么卵用。


  mViewapger.setOffscreenPageLimit(0);


 /**
     * Set the number of pages that should be retained to either side of the
     * current page in the view hierarchy in an idle state. Pages beyond this
     * limit will be recreated from the adapter when needed.
     *
     * <p>This is offered as an optimization. If you know in advance the number
     * of pages you will need to support or have lazy-loading mechanisms in place
     * on your pages, tweaking this setting can have benefits in perceived smoothness
     * of paging animations and interaction. If you have a small number of pages (3-4)
     * that you can keep active all at once, less time will be spent in layout for
     * newly created view subtrees as the user pages back and forth.</p>
     *
     * <p>You should keep this limit low, especially if your pages have complex layouts.
     * This setting defaults to 1.</p>
     *
     * @param limit How many pages will be kept offscreen in an idle state.

     */


4 这里还没有找到很好地方案;

时间换空间
空间换时间

方案一:
如果,你想要预加载的话,现在还没有很好地方案;

方案二:
禁用Viewpager 的预加载, 只能修改源码!
自己搜一下吧!很简单的!

这是禁掉预加载之后的ViewPager

对于显示的效果上 是很有影响的,用户的体验度有一定的影响,很多时候 鱼与熊掌不可兼得!

No comments:

Post a Comment