在制作轮播图中常常用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("下一个图");
}
}
}