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
私はすでにメインスレッドにいますよね?どうすれば解決できますか?
御時間ありがとうございます。
編集:
====================================
ご回答ありがとうございます。これらの回答に基づいて、2つのソリューションに出会いました。
解決策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);
どちらが良いですか、それとも同じですか?
もう一度ありがとう。
メイン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);
それを解決する最も簡単な方法は、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 );
TimerTaskは、その上で実行されます独自のスレッド(= UIスレッドではありません)。
ハンドラーを使用して、メインスレッドで直接setCurrentItemを呼び出すことができます。