2012-02-06 12 views
6

Necesito un poco de ayuda para actualizar mi interfaz de usuario de Runnable/Handler cada segundo. Estoy usando este código:actualización de Android ui desde el controlador cada segundo

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

        } 
       }); 
     } 
    }; 

he intentado con handler.postDelayed(runnable, 1000); en onCreate(), pero el ejecutable no se inicia. O incluso si lo intento con runnable.run();, todavía no está funcionando.

¿Alguna idea de cómo puedo iniciar el ejecutable/manejador y actualizar la interfaz de usuario cada segundo?

Respuesta

24

¿Por qué está creando un ejecutable en un ejecutable?

Prueba esto:

// 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

y cómo puede dejar de que después de eso? Quiero decir que necesito que esto se ejecute solo cuando obtengo datos a través de Internet y quiero detener el ejecutable después de que termine la actividad o haga clic en el botón Cancelar. –

+0

actualizó mi respuesta e introdujo una bandera – WarrenFaith

+2

En realidad 'handler.removeCallbacks (ejecutable);' está haciendo lo mismo. –

1

Si desea actualizar la interfaz de usuario, creo que este es mejor opción

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

¿se puede usar el código anterior para alternar entre los estados del botón de alternar ...? –

Cuestiones relacionadas