Android ViewPager自动更改页面

我想安排一个动作来自动更改我的ViewPager页面。 我试过了:

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

但我总是得到:

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

我已经在主线了吧? 我该如何解决这个问题?
谢谢你的时间。

====================================编辑:============ ========================

感谢您的答复。 基于这些回应,我遇到了两个解决scheme:
解决scheme1:

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

解决scheme2:

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

哪一个更好或者他们是一样的?
再次感谢。

Solutions Collecting From Web of "Android ViewPager自动更改页面"

如果你想在主UI使用线程,那么你需要使用手柄来交付。

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

最简单的方法是创build一个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 ); } }; 

正如你可以看到它将无限循环。 当你想停止它,只需打电话

  mHandler.removeCallbacks( mRunnable ); 

TimerTask将运行在它自己的线程 (=不是UI线程)上。

您可以使用Handler直接在主线程上直接调用setCurrentItem。