android timer android-viewpager ui-thread

Android ViewPager cambia automáticamente la página



timer android-viewpager (3)


Quiero programar una acción para cambiar automáticamente mis páginas de ViewPager. He intentado:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... swipeTimer = new Timer(); swipeTimer.schedule(new TimerTask() { @Override public void run() { if (currentPage == NUM_PAGES) { currentPage = 0; } featureViewPager.setCurrentItem(currentPage++, true); } }, 100, 500);

pero siempre estoy recibiendo:

E/AndroidRuntime(5381): FATAL EXCEPTION: Timer-0 E/AndroidRuntime(5381): java.lang.IllegalStateException: Must be called from main thread of process

Ya estoy en el hilo principal ¿verdad? ¿Como puedo resolver esto?
Gracias por tu tiempo.

EDITAR:
====================================

Gracias por todas sus respuestas. Basado en estas respuestas me encontré con 2 soluciones:
Solución 1:

swipeTimer = new Timer(); swipeTimer.schedule(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { if (currentPage == NUM_PAGES) { currentPage = 0; } featureViewPager.setCurrentItem(currentPage++, true); } }); } }, 500, 3000);

Solución 2:

final Handler handler = new Handler(); final Runnable Update = new Runnable() { public void run() { if (currentPage == NUM_PAGES) { currentPage = 0; } featureViewPager.setCurrentItem(currentPage++, true); } }; swipeTimer = new Timer(); swipeTimer.schedule(new TimerTask() { @Override public void run() { handler.post(Update); } }, 500, 3000);

¿Cuál es mejor o son iguales?
Gracias una vez más.


La forma más fácil de resolverlo es crear un ejecutable postDelayed

private Handler mHandler; public static final int DELAY = 5000; Runnable mRunnable = new Runnable() { @Override public void run() { //TODO: do something like mViewPager.setCurrentPage(mIterator); mHandler.postDelayed( mRunnable , DELAY ); } };

Como puedes ver, se repetirá infinitamente. Cuando quieras detenerlo, simplemente llama

mHandler.removeCallbacks( mRunnable );


Si desea utilizar el hilo en la interfaz de usuario principal, entonces necesita usar hander para entregarlo.

Handler handler = new Handler(); Runnable update = new Runnable() { public void run() { if (currentPage == NUM_PAGES - 1) { currentPage = 0; } featureViewPager.setCurrentItem(currentPage++, true); } }; new Timer().schedule(new TimerTask() { @Override public void run() { handler.post(update); } }, 100, 500);


TimerTask se ejecutará en su propio hilo (= no en el hilo de la interfaz de usuario).

Simplemente puede llamar a setCurrentItem directamente en el hilo principal usando un controlador.