ViewPager - 如何在每个页面上启动不同的定时器?
我只需要为ViewPager中的每个页面创建一个新的单独计时器。 我目前的实现包含所有页面的一个处理程序。 我使用ViewPager.OnPageChangeListener.onPageSelected()启动新的TimerTask,但正如我在应用程序工作期间看到的,runnables堆栈和计时器变得越来越快,一次更新所有文本浏览,即使我试图删除所有的回调处理程序。
它应该如何工作:滑动到第1页 - 定时器1开始,滑动到第2页 - 定时器1复位并停止,定时器2开始,等等。
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int page) {
}
public void onPageScrolled(int position, float arg1, int arg2) {
}
public void onPageSelected(int position) {
View currentPage = ((QuestionPagerAdapter) viewPager.getAdapter()).get(position);
timerText = (TextView) currentPage.findViewById(R.id.timerText);
handler.removeCallbacks(doTick);
if (timerText != null) startTimer();
}
});
可运行的实现:
final Runnable doTick = new Runnable() {
public void run() {
seconds--;
if (seconds == -1) {
minutes--;
seconds = 59;
}
String secText = String.valueOf(seconds);
if (seconds < 10) secText = "0" + secText;
timerText.setText("0" + String.valueOf(minutes) + ":" + secText);
viewPager.getAdapter().notifyDataSetChanged();
}
};
private void startTimer() {
for (int i = 1; i <= seconds; i++) {
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.post(doTick);
}
};
timer.schedule(task, i * 1000);
}
}
你在哪里实例化新的doTick Runnable? 这应该只进行一次,否则,您将无法删除与doTick实例关联的所有回调,因为您将丢失它并将其替换为新实例。
声明它有一个数据字段并修改你的startTimer方法如下:
private void startTimer( TextView textView ) {
if( doTicks != null ) {
handler.removeCallbacks(doTick);
doTicks = new doTicks( textView );
}
for (int i = 1; i <= seconds; i++) {
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.post(doTick);
}
};
timer.schedule(task, i * 1000);
}
}
您还需要为您的doTicks Runnable提供一个参数,以便为其提供必须更新的字段的引用。 将此参数也传递给startTimer,并且不要将此字段的引用作为活动的数据成员,而仅作为doTicks的数据成员(因此您需要创建一个真正的静态内部类)。
链接地址: http://www.djcxy.com/p/13005.html上一篇: ViewPager — how to start different timers on each page?