web-dev-qa-db-ja.com

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

私はすでにメインスレッドにいますよね?どうすれば解決できますか?
御時間ありがとうございます。

編集:
====================================


ご回答ありがとうございます。これらの回答に基づいて、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);

どちらが良いですか、それとも同じですか?
もう一度ありがとう。

21
GuilhE

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

それを解決する最も簡単な方法は、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 );
10
Klawikowski

TimerTaskは、その上で実行されます独自のスレッド(= UIスレッドではありません)。

ハンドラーを使用して、メインスレッドで直接setCurrentItemを呼び出すことができます。

2
ddewaele