2

私が望むのは、ViewPager のページごとに新しい個別のタイマーを作成することだけです。私の現在の認識には、すべてのページに対する 1 つのハンドラーが含まれています。ViewPager.OnPageChangeListener.onPageSelected() を使用して新しい TimerTask を開始しますが、アプリケーションの動作中にわかるように、ランナブル スタックとタイマーはどんどん速くなり、すべてのテキストビューを一度に更新します。ハンドラー。

動作方法: ページ 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); 
    }
}
4

1 に答える 1

1

新しい doTick Runnable をどこでインスタンス化しますか? これは 1 回だけ実行する必要があります。そうしないと、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 のデータ メンバーとしてのみ保持します (したがって、真の静的内部クラスを作成する必要があります)。

于 2012-11-07T19:51:55.960 に答える