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?

下一篇: How to change fontFamily of TextView in Android