2012-02-06 15 views
6

Potrzebuję trochę pomocy z aktualizowaniem mojego interfejsu użytkownika z Runnable/Handler co sekundę. Używam tego kodu:Ui aktualizacji Androida od obsługi co sekundę

Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 

         prBar.setProgress(myProgress); 
         y = (double) ((double) myProgress/ (double) RPCCommunicator.totalPackets)*100; 
         txtInfoSync1.setText(Integer.toString((int)y) + "%"); 
         prBar.setMax(RPCCommunicator.totalPackets); 

         int tmp = totalBytesReceived - timerSaved; 
         Log.w("","totalBytesReceived : "+totalBytesReceived + " timerSaved : "+timerSaved); 
         Log.w("","tmp : "+tmp); 

         if (avgSpeedCalc.size() > 10) 
         { 
          avgSpeedCalc.remove(0); 
         } 

         avgSpeedCalc.add(tmp); 

         int x = 0; 

         for (int y=0;y<avgSpeedCalc.size();y++) 
         { 
          x += avgSpeedCalc.get(y); 
          Log.d("","x : "+x); 
         } 

         x = Math.round(x/avgSpeedCalc.size()); 
         Log.e("","x : "+x); 

         timerSaved = totalBytesReceived; 
         txtSpeed.setText(Integer.toString(x)); 

        } 
       }); 
     } 
    }; 

Próbowałem z handler.postDelayed(runnable, 1000); w onCreate(), ale runnable nie uruchamia. Lub nawet jeśli spróbuję z runnable.run();, nadal nie działa.

Jakieś pomysły, w jaki sposób mogę uruchomić uruchamianie/obsługi i aktualizować ui co sekundę?

Odpowiedz

24

Dlaczego tworzysz działające w runnable?

Spróbuj tego:

// flag that should be set true if handler should stop 
boolean mStopHandler = false; 

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // do your stuff - don't create a new runnable here! 
     if (!mStopHandler) { 
      mHandler.postDelayed(this, 1000); 
     } 
    } 
}; 

// start it with: 
mHandler.post(runnable); 
+0

i jak mogę go zatrzymać po tym? Chodzi mi o to, że muszę to uruchamiać tylko wtedy, gdy dostaję dane przez Internet i chcę zatrzymać uruchamianie po zakończeniu działania lub przycisku anulowania kliknięcia przez użytkownika. –

+0

zaktualizowałem moją odpowiedź i wprowadziłem flagę – WarrenFaith

+2

Właściwie 'handler.removeCallbacks (runnable);' robi to samo. –

1

Jeśli chcesz zaktualizować UI myślę, że to jest najlepsza opcja

new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //Do your work 
      } 
     },500); 
+0

Czy powyższy kod może być użyty do przełączania pomiędzy stanami przełącznika ..? –

Powiązane problemy