Je souhaite planifier une action pour modifier automatiquement mes pages ViewPager. J'ai essayé:
@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);
mais je reçois toujours:
E/AndroidRuntime(5381): FATAL EXCEPTION: Timer-0
E/AndroidRuntime(5381): Java.lang.IllegalStateException: Must be called from main thread of process
Je suis déjà dans le fil principal, non? Comment puis-je résoudre ça?
Merci pour votre temps.
ÉDITER:
====================================
Merci pour toutes vos réponses. Sur la base de ces réponses, je suis tombé sur 2 solutions:
Solution 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);
Solution 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);
Lequel est le meilleur ou ce sont les mêmes?
Encore merci.
Si vous souhaitez utiliser du fil dans l'interface utilisateur principale, vous devez utiliser le support pour le remettre.
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);
Le moyen le plus simple de le résoudre est de créer un exécutable 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 );
}
};
comme vous pouvez le voir, il bouclera à l'infini. Lorsque vous voulez l'arrêter, appelez simplement
mHandler.removeCallbacks( mRunnable );
La TimerTask s'exécute sur son propre thread (= pas le thread de l'interface utilisateur).
Vous pouvez simplement appeler setCurrentItem directement sur le thread principal à l'aide d'un gestionnaire.