2012-02-06 12 views
6

Ho bisogno di un piccolo aiuto per aggiornare la mia interfaccia utente da Runnable/Handler ogni secondo. Sto usando questo codice:Aggiornamento per Android ui dal gestore ogni secondo

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

        } 
       }); 
     } 
    }; 

ho provato con handler.postDelayed(runnable, 1000); in onCreate(), ma l'eseguibile non si avvia. O anche se provo con runnable.run();, non funziona ancora.

Qualche idea come posso avviare runnable/handler e aggiornare l'interfaccia utente ogni secondo?

risposta

24

Perché stai creando una eseguibile in una eseguibile?

Prova questo:

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

e come posso fermarlo dopo? Voglio dire che ho bisogno di questo per eseguire solo quando sto ottenendo dati su Internet e voglio interrompere il runnable dopo l'attività di finitura o il pulsante Annulla clic utente. –

+0

ha aggiornato la mia risposta e ha introdotto una bandiera – WarrenFaith

+2

In realtà 'handler.removeCallbacks (eseguibile);' sta facendo la stessa cosa. –

1

Se si desidera aggiornare l'interfaccia utente penso che questo sia migliore opzione

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

è possibile utilizzare il codice sopra riportato per alternare gli stati del pulsante di commutazione ...? –

Problemi correlati