ViewPager实现无限循环,左右滑动,定时轮播及内存泄漏处理

ViewPager实现无限循环,左右滑动,定时轮播及内存泄漏处理

  • PagerAdapter 代码

    @Override
    public int getCount() {
    return Integer.MAX_VALUE;
    }

  • 关键是将viewpager的数量设置为最大
  • 剩下的代码就简单了

    `@Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager)container).removeView(list.get(position%list.size()));
    }
    

`
* 销毁的代码

`@Override
    public Object instantiateItem(ViewGroup container, int position) {
        // TODO Auto-generated method stub
    View view = list.get(position%list.size());
    container.addView(view,0);
        return view;
    }`

* 这里都是取得余数,因为我们实际对象个数,只有list.size()个
* 之后默认选中第n个就行了

`   spVpager.setCurrentItem(vpList.size()*400);`

* 这样写的话,可以实现左右滑动(不要设置太大,否则回退现象很明显)
* hander中实现轮播

    `public void handleMessage(android.os.Message msg) {
    int position=   spVpager.getCurrentItem()+1;
    if(!isMove&&state==OnScrollListener.SCROLL_STATE_IDLE)
        spVpager.setCurrentItem(position,true);
        sendEmptyMessageDelayed(0, 5000);
    };`

* 需要判断是否移动过了,和当前的pagerItem的状态(优化)
* 因为使用了Handler发送延时消息,因此会造成内存泄漏,因此需要在onDestory中移除所有的任务和消息

`handler.removeCallbacksAndMessages(null);

* 进一步对内存泄漏进行优化 否则activity销毁不了
* 内存泄漏分析
* activity想要销毁的话,其会销毁handler,handler要想销毁的话,handler中不能有任务和Message,因为发送的是延时的任务,因此handler中很有可能有任务执行,有任务执行的时候handler销毁不了,handler又持有activity的引用,因此造成一个死循环,导致activity销毁失败

这里是使用内存溢出,来演示的内存泄漏问题,当横竖屏3次之后出现崩溃

handler.removeCallbacksAndMessages(null);调用之后不会出现内存泄漏,因此内存一致都够用,也就不会oom

欢迎加android交流群:511862116

发布了33 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013356254/article/details/50808439