【移动开发】ViewPager缓存机制
1. 实现ViewPager的页面懒加载;
在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容。
2. 可控ViewPager缓存页面的数量。
常见的情况:1.页面的总数是已知的,或者可以计算出来,每个页面占用的资源并不多并且需要经常使用这些页面。这是可以考虑将其常驻ViewPager而不去销毁(频繁的销毁和重建也会消耗比较多的资源)。2.切换页面时默认情况下非相邻的页面会被销毁掉(ViewPager默认缓存或预加载相邻的页面以便快速切换),如果想要保持页面之前的状态,如滚动条滚动位置等比较困难;这是可以考虑将之前的页面缓存下来而不销毁掉。
ViewPager的默认加载与缓存模式
ViewPager和ListView、GridView等的数据加载方式类似,控件本身都提供了数据加载的适配器接口,程序员只需实现特定的Adapter就可以轻松的将数据填充到容器中。
我们来看一个简单的Demo
1.ViewPager懒加载和缓存测试类
- public class MainActivity extends Activity {
- private static final String TAG = "com.example.viewpagertest.MainActivity";
- private MyViewPager viewPager;
- private List<View> pagers = new ArrayList<View>();
- /** ViewPager缓存页面数目;当前页面的相邻N各页面都会被缓存 */
- private int cachePagers = 1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getViews();
- setContentView(viewPager);
- setListener();
- setAdapter();
- }
- private void getViews() {
- viewPager = new MyViewPager(this);
- for (int i = 0; i < 5; i++) {
- TextView textView = new TextView(this);
- pagers.add(textView);
- viewPager.onDisplay(i);//测试1
- }
- viewPager.setOffscreenPageLimit(cachePagers);// 设置缓存页面,当前页面的相邻N各页面都会被缓存
- }
- private void setAdapter() {
- viewPager.setAdapter(pagerAdapter);
- }
- private void setListener() {
- viewPager.setOnPageChangeListener(pageChangeListener);
- }
- /**
- * 页面数据适配器
- */
- private PagerAdapter pagerAdapter = new PagerAdapter() {
- @Override
- public void destroyItem(View container, int position, Object object) {
- Log.i(TAG, "destroyItem:" + position);
- ((ViewGroup) container).removeView((View) object);
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- Log.i(TAG, "destroyItem:" + position);
- container.removeView((View) object);
- }
- @Override
- public Object instantiateItem(View container, int position) {
- Log.i(TAG, "instantiateItem:" + position);
- try {
- ((ViewPager) container).addView(pagers.get(position));
- // ((MyViewPager) container).onDisplay(position);//测试2
- } catch (Exception e) {
- Log.e(TAG, e.getMessage());
- }
- return pagers.get(position);
- }
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- Log.i(TAG, "instantiateItem:" + position);
- try {
- ((ViewPager) container).addView(pagers.get(position));
- // ((MyViewPager) container).onDisplay(position);//测试2
- } catch (Exception e) {
- Log.e(TAG, e.getMessage());
- }
- return pagers.get(position);
- }
- @Override
- public boolean isViewFromObject(View arg0, Object arg1) {
- return arg0 == arg1;
- }
- @Override
- public int getCount() {
- return pagers.size();
- }
- };
- /**
- * 页面滚动监听器
- */
- private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
- @Override
- public void onPageSelected(int arg0) {
- Log.i(TAG, "onPageSelected:" + arg0);
- // viewPager.onDisplay(arg0);//测试3
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- };
- /**
- * @Title setPageData
- * @Description 加载页面数据
- * @param position
- */
- private void setPageData(int position) {
- TextView textView = (TextView) pagers.get(position);
- textView.setText("pager" + position);
- Log.i(TAG, "setPageData position:" + position);
- }
- class MyViewPager extends ViewPager implements IPagerDisplay {
- public MyViewPager(Context context) {
- super(context);
- }
- public MyViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- public void onDisplay(int position) {
- setPageData(position);
- }
- }
- }
2.ViewPager数据展示回调接口
- /**
- * @Title IPagerDisplay.java
- * @Package com.example.viewpagertest
- * @Description ViewPager数据展示回调
- * @author ze.chen
- * @date 2013-5-13 下午2:25:38
- * @version V1.0
- */
- package com.example.viewpagertest;
- /**
- * @ClassName IPagerDisplay
- * @Description ViewPager懒加载展接口;可以在PagerAdapter的instantiateItem时候调用,
- * 亦可以在OnPageChangeListener的onPageSelected时候调用
- * ,两处的区别在于,instantiateItem方法ViewPager会自动缓冲
- * (浏览pager1时将pager2的数据加载好),
- * 而onPageSelected则不会自动缓冲(浏览pager2时才加载pager2的数据)
- * @author ze.chen
- * @date 2013-5-13 下午2:25:38
- *
- */
- public interface IPagerDisplay {
- void onDisplay(int position);
- }
使ViewPager支持懒加载
在以上代码段中,分别注释了:测试1;测试2;测试3。
测试1:在加载ViewPager之前,初始化所有的页面和数据
- viewPager = new MyViewPager(this);
- for (int i = 0; i < 5; i++) {
- TextView textView = new TextView(this);
- pagers.add(textView);
- viewPager.onDisplay(i);//测试1
- }
对于测试2和测试3,只将控件添加到pagers列表中,数据不立刻加载
测试2:在ViewPager的页面实例化的时候加载数据,预加载的时候也会执行该方法。
- public Object instantiateItem(View container, int position) {
- Log.i(TAG, "instantiateItem:" + position);
- try {
- ((ViewPager) container).addView(pagers.get(position));
- ((MyViewPager) container).onDisplay(position);//测试2
- } catch (Exception e) {
- Log.e(TAG, e.getMessage());
- }
- return pagers.get(position);
- }
测试3:当该页面被选中的时候才加载该页面的数据,预加载页面时不会加载预加载页的数据。
- private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
- @Override
- public void onPageSelected(int arg0) {
- Log.i(TAG, "onPageSelected:" + arg0);
- viewPager.onDisplay(arg0);//测试3
- }
- ……
修改ViewPager的缓存页面数量
- viewPager.setOffscreenPageLimit(int numbers);
viewpager当前页面两侧缓存/预加载的页面数目。当页面切换时,当前页面相邻两侧的numbers页面不会被销毁。
参考资料
http://ranfeng0610.blog.163.com/blog/static/18570828420137206492642/
http://zilla.blog.51cto.com/3095640/1199366
http://blog.csdn.net/wangjinyu501/article/details/8169924
【移动开发】ViewPager缓存机制的更多相关文章
- H5 缓存机制浅析 移动端 Web 加载性能优化
腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...
- ViewPager的缓存机制
1.实现Viewpager的页面懒加载: 在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容. 2.可控V ...
- IOS - 开发之内存缓存机制
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...
- iOS开发之内存缓存机制
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...
- IOS开发缓存机制之—本地缓存机制
功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...
- JPA,EclipseLink 缓存机制学习(一) 树节点搜索问题引发的思考
最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...
- android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))
在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...
- Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
转载:http://mp.weixin.qq.com/s/uWPls0qrqJKHkHfNLmaenQ 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必 ...
随机推荐
- 51 nod 1406 与查询
1406 与查询 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有n个整数.输出他之中和x相与之后结果为x的有多少个.x从0 ...
- [BZOJ]4810: [Ynoi2017]由乃的玉米田
Time Limit: 30 Sec Memory Limit: 256 MB Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差 ...
- bzoj1493[NOI2007]项链工厂 线段树
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1712 Solved: 723[Submit][Status] ...
- 笔记8 AOP练习2
场景描述: 一张唱片有好多磁道,假设每个磁道只有一首歌,现在需要记录每首歌的播放次数,然后输出. 主要业务:歌曲播放 辅助功能:记录播放次数(切面) 1.创建唱片接口,CompactDiscs.jav ...
- c++中双冒号的作用
双冒号(::)用法 参考链接:https://segmentfault.com/a/1190000000345680 1.表示“域操作符”例:声明了一个类A,类A里声明了一个成员函数void f(), ...
- 谷歌发布 TensorFlow Serving
TensorFlow服务是一个灵活的,高性能的机器学习模型的服务系统,专为生产环境而设计. TensorFlow服务可以轻松部署新的算法和实验,同时保持相同的服务器体系结构和API. TensorFl ...
- 入口开始,解读Vue源码(一)-- 造物创世
Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一 ...
- SpringMVC 教程 - URI 链接
原文链接:https://www.codemore.top/cates/Backend/post/2018-04-22/spring-mvc-uri-links 这一节主要讲的是Spring Fram ...
- Java Spring boot 2.0 跨域问题
跨域 一个资源会发起一个跨域HTTP请求(Cross-site HTTP request), 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时 . 比如说,域名A(http://dom ...
- 基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台
作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...
