2016-08-03 5 views
6

Próbuję uruchomić pętlę for w każdym sekundzie. Pętla zmienia coś w widoku za każdym razem, gdy jest wywoływana , ale zmiany są dokonywane przez inną klasę, np. Prędkościomierz.Android "Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać swoich widoków." Błąd w pętli for

Thread thread=new Thread(){ 
     @Override 
     public void run() { 
      float i; 
      try { 

       for (i = 0; i <= 100; i++) { 
          Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8); 
          Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8); 
          Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8); 
          Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8); 
          Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8); 
          Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8); 


        sleep(500); 
       } 
      } 
      catch (InterruptedException e) 
      {e.printStackTrace();} 
     } 
    };thread.start(); 
+2

patrz [Android „ Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać jej widoków. "] (Http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can -touch-it-vi) –

Odpowiedz

9

To dlatego, że każdy pogląd może być tylko modyfikować w głównym wątku lub ui wątek. Spróbuj uruchomić onSpeedChanged() przy użyciu runOnUiThread(). W ten sposób:

Thread thread=new Thread(){ 
    @Override 
    public void run() { 
     float i; 
     try { 

      for (i = 0; i <= 100; i++) { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8); 
         Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8); 
         Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8); 
         Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8); 
         Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8); 
         Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8) 

        } 

       }); 


       sleep(500); 
      } 
     } 
     catch (InterruptedException e) 
     {e.printStackTrace();} 
    } 
};thread.start(); 
+0

Działa perfekcyjnie ... Wielkie dzięki – Ariel

5

Należy zaktualizować składników interfejsu użytkownika w runOnUIThread kodu .Sample jest

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

     //stuff that updates ui 

    } 
}); 
+1

wielkie dzięki, zadziałało! – bboydflo

0

Nie można modyfikować obiektów View spoza głównego wątku. Nawet jeśli twoja klasa Speedometer dokonuje zmian, działa ona w utworzonym wątku dodatkowym.

Można utworzyć Runnable i opublikować z deejay na Handler utworzone przez główny wątek, lub użyć innych podobnych technik, aby osiągnąć to samo.

3

Należy zaktualizować swój interfejs użytkownika w wątku interfejsu użytkownika.

W tym celu utworzyć uchwyt w onCreate() metoda:

private Handler mHandler; 

@Override 
public void onCreate() { 
    mHandler = new Handler(); 
    // ... 
} 

Następnie zadzwonić do obsługi w swoim osobnym wątku, aby wykonać go w głównym wątku:

mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // Update your UI 
    } 
}); 
Powiązane problemy