我想安排一个动作来自动更改我的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
我已经在主线程中吗?我怎么解决这个问题呢? 谢谢你的时间。
修改:
====================================
谢谢你的所有答案。基于这些回答,我遇到了两个解决方案:
解决方案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);
解决方案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);
哪一个更好或者它们是相同的?
再次感谢。
答案 0 :(得分:59)
如果你想在主ui中使用线程,那么你需要使用hander来处理它。
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);
答案 1 :(得分:10)
如何解决它的最简单方法是创建一个postDelayed runnable
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 );
答案 2 :(得分:2)
TimerTask将在它的自己的线程上运行(=不是UI线程)。
您可以使用Handler直接在主线程上调用setCurrentItem。