GuilhE GuilhE - 6 months ago 96
Android Question

Android ViewPager automatically change page



I want to schedule an action to change automatically my ViewPager pages.
I've tried:

@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);


but I'm always getting:

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


I'm already in main thread right? How can I solve this?

Thanks for your time.

====================================
EDIT:
====================================




Thanks for all your answers. Based on these responses I came across 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);


Which one is better or they are the same?

Thanks once again.

Answer

If you want to use thread in main ui then you need to use hander to hand it.

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