实现图片轮播的几种方法

思路:开启一个子线程,在子线程中设置当前页卡的位置并向主线程中发送消息,每隔一定的时间间隔执行一次子线程,然后用handler接收子线程发过来的消息,并在这里刷新UI(设置当前位置的图片)。

1.使用timer实现

timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
           public void run() {
               currentItem = (currentItem +1) % imageViews.size();
                handler.sendEmptyMessage(0);
            }
        },2000,2000);
        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                viewPager.setCurrentItem(currentItem);
                return false;
            }
        });

2.使用Thread实现:这里在run方法里为了能一直使图片轮播,所以把把要执行的任务放在死循环里

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (true){
                    Thread.sleep(2000);
                    currentItem = (currentItem + 1) % imageViews.size();
                    handler.sendEmptyMessage(0);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                viewPager.setCurrentItem(currentItem);
                return false;
            }
        });

3.使用线程池实现:首先在onStrat方法里开启线程池,scheduledExecutorService的scheduleWithFixedDelay方法里的参数是
1.子线程,2.初次执行时间,3.时间间隔,4.时间单位

@Override
    protected void onStart() {
        super.onStart();
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleWithFixedDelay(new MyRunnable(),2,2, TimeUnit.SECONDS);
        // 或者用下面一种,效果是一样的
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new MyRunnable(),2,2,TimeUnit.SECONDS);
    }
 public class MyRunnable implements Runnable{

        @Override
        public void run() {
            currentItem = (currentItem + 1)%imageViews.size();
            handler.sendEmptyMessage(0);
        }
    }

刷新UI的代码

private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            viewPager.setCurrentItem(currentItem);
            return false;
        }
    });
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值