我只需要爲ViewPager中的每個頁面創建新的單獨計時器。 我目前的實現包含所有頁面的一個處理程序。我使用ViewPager.OnPageChangeListener.onPageSelected()啓動新的TimerTask,但正如我在應用程序工作期間看到的,runnables堆棧和計時器變得越來越快,一次更新所有文本瀏覽,即使我試圖刪除所有的回調處理程序。ViewPager - 如何在每個頁面上啓動不同的定時器?
它應該如何工作:滑動到第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();
}
});
Runnable接口實現:
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);
}
}
現在可以使用textViews了。但是有一件事 - 每當我滑過頁面時,定時器堆棧和秒數都會變得更快,回調似乎不會被刪除。 – sonderlain
你確定你在每個實例上調用removeCallBack嗎?在控制檯中輸出你的runnable,他們會給你他們的「地址」:每次你創建一個時打印它們,每次你調用removecallbacks。他們應該匹配。 – Snicolas
非常感謝,但我還沒有想出這個東西。 我簡單地使用android.os.CountDownTimer解決了我的問題,它非常適合。 – sonderlain