web-dev-qa-db-fra.com

Android ViewPager change automatiquement de page


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.

21
GuilhE

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);
60
Md Abdul Gafur

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 );
10
Klawikowski

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.

2
ddewaele