Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?

Últimamente vi http://developer.android.com/reference/android/os/CountDownTimer.html y me preguntaba si hay una clase respectiva para los relojes de parada ya que quiero decirle al usuario de mi aplicación cuánto tiempo que ya está tratando de resolver el rompecabezas. Quiero decir que no es tan complicado programar tal stop watch por su cuenta. Probé algo así

Runnable runnable = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } long seconds = (System.currentTimeMillis() - t) / 1000; statusBar.setText(String.format("%02d:%02d", seconds / 60, seconds % 60)); } } }; statusBar.post(runnable); 

Pero extrañamente el diseño de mi actividad ya no está inflado ya que tengo este statusBar.post(runnable); Al final del método onCreate del onCreate , lo que significa que después de iniciar la aplicación sólo veo una pantalla en blanco en lugar de la gui normal.

  • ¿Cómo dejar de ejecutar cuando la aplicación va a fondo?
  • ¿Cómo poner un runnable en paquete?
  • Android: ¿Cómo puedo detener Runnable?
  • Tomando un cómputo pesado del subproceso de la interfaz de usuario de Android
  • ¿Es este hilo seguro?
  • El hilo no interrumpe
  • RemoveCallbacks no se detiene runnable
  • 4 Solutions collect form web for “¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?”

    Usted debe utilizar un cronómetro.

    Pero de todos modos, su código puede funcionar si se quita el sueño de hilo de interfaz de usuario.

     private final Runnable mRunnable = new Runnable() { @Override public void run() { if (mStarted) { long seconds = (System.currentTimeMillis() - t) / 1000; statusBar.setText(String.format("%02d:%02d", seconds / 60, seconds % 60)); handler.postDelayed(runnable, 1000L); } } }; private Hanlder mHandler; private boolean mStarted; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler = new Handler(); } @Override protected void onStart() { super.onStart(); mStarted = true; mHandler.postDealyed(runnable, 1000L); } @Override protected void onStop() { super.onStop(); mStarted = false; mHandler.removeCallbacks(mRunnable); } 

    Echa un vistazo a la clase de cronómetro .

    Ejemplo de código de APIDemo:

     import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Chronometer; public class ChronometerDemo extends Activity { Chronometer mChronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chronometer); Button button; mChronometer = (Chronometer) findViewById(R.id.chronometer); // Watch for button clicks. button = (Button) findViewById(R.id.start); button.setOnClickListener(mStartListener); button = (Button) findViewById(R.id.stop); button.setOnClickListener(mStopListener); button = (Button) findViewById(R.id.reset); button.setOnClickListener(mResetListener); button = (Button) findViewById(R.id.set_format); button.setOnClickListener(mSetFormatListener); button = (Button) findViewById(R.id.clear_format); button.setOnClickListener(mClearFormatListener); } View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { mChronometer.start(); } }; View.OnClickListener mStopListener = new OnClickListener() { public void onClick(View v) { mChronometer.stop(); } }; View.OnClickListener mResetListener = new OnClickListener() { public void onClick(View v) { mChronometer.setBase(SystemClock.elapsedRealtime()); } }; View.OnClickListener mSetFormatListener = new OnClickListener() { public void onClick(View v) { mChronometer.setFormat("Formatted time (%s)"); } }; View.OnClickListener mClearFormatListener = new OnClickListener() { public void onClick(View v) { mChronometer.setFormat(null); } }; } 

    R.layout.chronometer:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <Chronometer android:id="@+id/chronometer" android:format="@string/chronometer_initial_format" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:paddingBottom="30dip" android:paddingTop="30dip" /> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chronometer_start"> <requestFocus /> </Button> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chronometer_stop"> </Button> <Button android:id="@+id/reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chronometer_reset"> </Button> <Button android:id="@+id/set_format" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chronometer_set_format"> </Button> <Button android:id="@+id/clear_format" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/chronometer_clear_format"> </Button> </LinearLayout> 

    Añada esto a Strings.xml

     <string name="chronometer_start">Start</string> <string name="chronometer_stop">Stop</string> <string name="chronometer_reset">Reset</string> <string name="chronometer_set_format">Set format string</string> <string name="chronometer_clear_format">Clear format string</string> <string name="chronometer_initial_format">Initial format: <xliff:g id="initial-format">%s</xliff:g></string> 

    ¿Por qué su código no funciona es porque se registra una Runnable a la cola de mensajes de subproceso de interfaz de usuario. El runnable se ejecuta para siempre en el bucle while, impidiendo que el hilo de UI haga cualquier otro negocio, como dibujar su diseño y responder a las entradas.

    Usar Thread.sleep() en un subproceso de interfaz de usuario casi siempre es incorrecto. Considere la posibilidad de utilizar un Timer lugar.

    Usted debe utilizar un cronómetro .

     Chronometer mChronometer; mChronometer = (Chronometer) findViewById(R.id.chronometer1); long timeWhenStopped = 0; 

    Cuando detenemos el cronómetro

     timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime(); mChronometer.stop(); 

    El cronómetro antes de iniciarlo

     mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped); mChronometer.start(); 

    Restablecer el cronómetro

     mChronometer.setBase(SystemClock.elapsedRealtime()); timeWhenStopped = 0; 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.