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.