Android ViewPager自动更改页面

Android ViewPager自动更改页面,android,timer,android-viewpager,ui-thread,Android,Timer,Android Viewpager,Ui Thread,我想安排一个操作来自动更改我的ViewPager页面。 我试过: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... swipeTimer = new Timer(); swipeTimer.schedule(new TimerTask() { @Override pu


我想安排一个操作来自动更改我的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);
哪一个更好或相同?

再次感谢。

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


您可以使用处理程序直接在主线程上调用setCurrentItem。

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

如果你想在主界面中使用线程,那么你需要使用hander来处理它

Handler handler = new Handler();

        Runnable update = new Runnable()  {

            public void run() {
                if ( currentPage == NUM_PAGES ) {

                    currentPage = 0;
                }
                featureViewPager.setCurrentItem(currentPage++, true);
            }
        };


        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                handler.post(update);
            }
        }, 100, 500);

您可以使用广播接收器在特定时间更改页面,注册接收器并在您要更改页面签出时调用它。您应该使用ViewAnimator(例如ViewFlipper:),这样可以使工作更轻松,或者使用处理程序(内置于主线程中:),您可以将此代码用于自动滑动新处理程序()。postDelayed(new Runnable()){public void run(){if(currentPage==NUM_PAGES-1){currentPage=0;}featureViewPager.setCurrentItem(currentPage++,true);}}}},3000);这样行吗?如何更改速度?我最多有3页,
if(currentPage==NUM_PAGES-1){currentPage=0;}featureViewPager.setCurrentItem(currentPage++,true);
我发现这个错误,我的页面索引是0,1,2-它将在第二个页面中滑动,但不会继续到第二个页面(页面索引)@RoCk即使我面临同样的问题,我最多有4个页面,而我的上一个页面没有加载,所以我将条件更改为
if(currentPage==NUM\u pages)
。现在它正在工作。我有同样的问题,我有3个图像要滑动,我必须更改为:if(holder.currentPage==holder.dotscont-0){holder.currentPage=0;}正在运行。所有图像都在滑动。