2013-06-18 12 views
15


Chcę zaplanować działania, aby automatycznie zmienić moje strony ViewPager. Próbowałem:Android ViewPager automatycznie zmienić stronę

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

ale ja zawsze się:

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

jestem już w głównym wątku prawo? Jak mogę to rozwiązać?
Dziękujemy za poświęcony czas.

==================================== EDIT: ===== ===============================

Dzięki za wszystkie odpowiedzi. Na podstawie tych odpowiedzi natknąłem 2 rozwiązania:
Rozwiązanie 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); 

Rozwiązanie 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); 

co jest lepsze lub są one takie same?
Dzięki jeszcze raz.

+0

można użyć odbiornika przekazu, aby zmienić stronę w określonym czasie, zarejestruj słuchawkę i zadzwonić, gdy u chcą zmienić czek strona – abhi

+1

[To] (http://stackoverflow.com/a/9738560/2479292) na zewnątrz. – zozelfelfo

+0

Powinieneś używać ViewAnimator (np. ViewFlipper: http://developer.android.com/reference/android/widget/ViewFlipper.html), a ułatwisz pracę lub skorzystasz z Handler'a (wbudowany w główny wątek: http: //developer.android.com/reference/android/os/Handler.html) – Laviniux

Odpowiedz

48

Jeśli chcesz używać wątku w głównym interfejsie, musisz użyć handera, aby go podać.

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

nowy Handler() postDelayed (nowa Runnable() { void run() {if ( currentPage == NUM_PAGES - 1) { currentPage = 0; } featureViewPager. setCurrentItem (currentPage ++, true); } }, 3000); Czy to działa? –

+1

jak zmienić prędkość ?? –

+1

Mam maksymalnie 3 strony, 'if (currentPage == NUM_PAGES - 1) { currentPage = 0; } featureViewPager.setCurrentItem (currentPage ++, true); ' Znalazłem ten jeden błąd, mój indeks stron wynosił 0,1,2 - będzie przesuwać w drugim, ale nie będzie kontynuował do 2 (indeks strony) . – RoCk

2

TimerTask będzie działał na swoim własnym własnym wątku (= nie wątku interfejsu użytkownika).

Możesz po prostu zadzwonić setCurrentItem bezpośrednio na głównym wątku, stosując Handler.

10

Najłatwiej jak go rozwiązać jest stworzenie 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); 
     } 
    }; 

jak widać to będzie pętli infinitelly. Jeśli chcesz go zatrzymać, po prostu zadzwoń pod numer

 mHandler.removeCallbacks(mRunnable); 
Powiązane problemy