关于轮播图中Handler迭代延时调用自己应用退出无法销毁问题

来源:互联网 发布:阿里云创建快照 编辑:程序博客网 时间:2024/05/21 09:39

在制作轮播图中常常用handler去延时调用自己本身run()的方法达到定时刷新的目的
如:

class HomeTask implements Runnable {        private void start() {            UIUtils.getHanHandlerdler().removeCallbacksAndMessages(null);// 取消handler的所有消息//UIUtils.getHandler()是封装好的可以获得一个Handler的方法            UIUtils.getHandler().postDelayed(this, 3000);        }        @Override        public void run() {            int currentItem = pager.getCurrentItem();//page是viewpage对象            pager.setCurrentItem(currentItem + 1);            UIUtils.getHandler().postDelayed(this, 3000);            System.out.println("下一个图");//根据日志判断退出后该方法是不是还在执行            }        }    }

当我在new HomeTask().start();后,viewpage便开始循环轮播,但是你会发现即使你退出应用该循环效果也会一直执行下去,从而很可能应用也并没有真的退出,我们要做到应用退出后(或activity Finnish掉)就不在循环,我采取的方法是在调用handler的class里想办法得到一个包含要调用的activity,这样就可以用Activity.isFinishing()方法来判断activity是不是在结束了
google翻译这么说的:
检查这个活动(Activity)是否正在完成(isFinishing),无论是因为您在其上调用了{@link #finish}或其他人请求完成。 这通常用在{@link #onPause}中,以确定活动是暂停还是完全完成。
修改后的类为

class HomeTask implements Runnable {        private void start() {            UIUtils.getHandler().removeCallbacksAndMessages(null);// 取消所有消息            UIUtils.getHandler().postDelayed(this, 3000);        }        @Override        public void run() {            int currentItem = pager.getCurrentItem();            pager.setCurrentItem(currentItem + 1);            if (!mActivity.isFinishing()) {                UIUtils.getHandler().postDelayed(this, 3000);                System.out.println("下一个图");            }        }    }