Android View Pager автоматически запускается и прокручивается автоматически через 5 секунд. В моем коде это занимает даже двойное время

В моем журнале текущая позиция вызывается дважды для одного и того же значения, а мой таймер занимает почти два раза. NUM_PAGES фактически принимает максимальный размер моего списка массивов.

    NUM_PAGES = detailsArrayList.size();

    // Auto start of viewpager
    final Handler handler = new Handler();
    final Runnable Update = new Runnable() {
        public void run() {
            if (currentPage == NUM_PAGES) {
                currentPage = 0;
            }
            Log.d(TAG, "Current Page: " + currentPage);
            mPager.setCurrentItem(currentPage++, false);
        }
    };
    final Timer swipeTimer = new Timer();
    swipeTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(Update);
        }
    }, 5000, 5000);

    // Pager listener over indicator
    indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            currentPage = position;
        }

        @Override
        public void onPageScrolled(int pos, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int pos) {
        }
    });

1 ответ

Я пробовал похожий упрощенный фрагмент кода, показанный ниже:

открытый класс MainActivity расширяет ActionBarActivity { int counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(Update);
        }
    }, 500, 500);
}

// Auto start of viewpager
final Timer timer = new Timer();
final Handler handler = new Handler();
final Runnable Update = new Runnable() {
    public void run() {
        Log.d("TimerTest", "First Log: " + counter);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            Log.d("TimerTest", e.toString());
        }
        //Log.d("TimerTest", "Second Log: " + counter);
        setCounter(counter++);
    }
};

void setCounter(int c) { counter = c; }

Результат кода:

03-01 19:03:25.936 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:26.436 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:26.946 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:27.456 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:27.966 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0
03-01 19:03:28.476 11865-11865/il.co.falk.timertest D/TimerTest: First Log: 0

Причина этого в том, что оператор приращения (++) - это постфикс. Возвращает старое значение и затем увеличивается.

С этого момента я могу только строить догадки. У вас нет функции set, но у вас есть что-то похожее с onPageSelected. Он вызывается, когда страница становится выделенной. Я предполагаю, что у вас есть состояние гонки. Если это произойдет после приращения, вы останетесь на месте, как в моем примере. В противном случае страница переместится на единицу.

Другие вопросы по тегам