detener la lógica del reloj

Quiero desarrollar una lógica simple de cronómetro en android.

Al hacer clic en una vista de lista, el temporizador debe comenzar y al hacer clic en el botón, el temporizador debe detenerse. ¿Alguien puede por favor guiarme? Cualquier código de muestra será de gran ayuda

Utilice la clase de cronómetro (para mayor precisión use System.nanoTime() )

Agregue un evento Start () y un evento Stop () al presionar un botón. Necesitarás actualizar la UI así que usa una combinación de Thread / Handler.

Esto debería ayudarte a comenzar.

EDITAR: Código agregado. (Buen ejercicio! :))

Use Refresh_Rate para configurar la frecuencia con la que se actualiza su UI.

 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class Main extends Activity implements OnClickListener{ final int MSG_START_TIMER = 0; final int MSG_STOP_TIMER = 1; final int MSG_UPDATE_TIMER = 2; Stopwatch timer = new Stopwatch(); final int REFRESH_RATE = 100; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSG_START_TIMER: timer.start(); //start timer mHandler.sendEmptyMessage(MSG_UPDATE_TIMER); break; case MSG_UPDATE_TIMER: tvTextView.setText(""+ timer.getElapsedTime()); mHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIMER,REFRESH_RATE); //text view is updated every second, break; //though the timer is still running case MSG_STOP_TIMER: mHandler.removeMessages(MSG_UPDATE_TIMER); // no more updates. timer.stop();//stop timer tvTextView.setText(""+ timer.getElapsedTime()); break; default: break; } } }; TextView tvTextView; Button btnStart,btnStop; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvTextView = (TextView)findViewById(R.id.TextView01); btnStart = (Button)findViewById(R.id.Button01); btnStop= (Button)findViewById(R.id.Button02); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); } public void onClick(View v) { if(btnStart == v) { mHandler.sendEmptyMessage(MSG_START_TIMER); }else if(btnStop == v){ mHandler.sendEmptyMessage(MSG_STOP_TIMER); } } } 

Como st0le dio un excelente ejemplo al usar la clase Cronómetro . Modifiqué un poco esta clase y le agregué algunos métodos.

 /* Copyright (c) 2005, Corey Goldberg StopWatch.java is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Modified: Bilal Rabbani bilalrabbani1@live.com (Nov 2013) */ package bilalrabbani1.at.live.com; public class Stopwatch { private long startTime = 0; private boolean running = false; private long currentTime = 0; public void start() { this.startTime = System.currentTimeMillis(); this.running = true; } public void stop() { this.running = false; } public void pause() { this.running = false; currentTime = System.currentTimeMillis() - startTime; } public void resume() { this.running = true; this.startTime = System.currentTimeMillis() - currentTime; } //elaspsed time in milliseconds public long getElapsedTimeMili() { long elapsed = 0; if (running) { elapsed =((System.currentTimeMillis() - startTime)/100) % 1000 ; } return elapsed; } //elaspsed time in seconds public long getElapsedTimeSecs() { long elapsed = 0; if (running) { elapsed = ((System.currentTimeMillis() - startTime) / 1000) % 60; } return elapsed; } //elaspsed time in minutes public long getElapsedTimeMin() { long elapsed = 0; if (running) { elapsed = (((System.currentTimeMillis() - startTime) / 1000) / 60 ) % 60; } return elapsed; } //elaspsed time in hours public long getElapsedTimeHour() { long elapsed = 0; if (running) { elapsed = ((((System.currentTimeMillis() - startTime) / 1000) / 60 ) / 60); } return elapsed; } public String toString() { return getElapsedTimeHour() + ":" + getElapsedTimeMin() + ":" + getElapsedTimeSecs() + "." + getElapsedTimeMili(); } } 

Saludos

Buen ejemplo, por si acaso alguien quiere que el archivo de diseño vaya con esto (bastante simple).

        

Compilado en Nexus-5

Basado en IntentService, sin dependencias que no sean SDK y en un solo archivo :

 import android.app.Activity; import android.app.IntentService; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class Main extends Activity { static final String BROADCAST_ACTION = "com.cirosantilli.android_cheat.intent_service_text_view.BROADCAST"; static final String EXTENDED_DATA_STATUS = "com.cirosantilli.android_cheat.intent_service_text_view.BROADCAST"; static final String TAG = "com.cirosantilli"; private int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate"); super.onCreate(savedInstanceState); final LinearLayout linearLayout = new LinearLayout(this); Button button; final Intent intent = new Intent(Main.this, MyService.class); button = new Button(this); button.setText("start service"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "start button"); Main.this.startService(intent.putExtra(Main.EXTENDED_DATA_STATUS, Main.this.i)); } }); linearLayout.addView(button); button = new Button(this); button.setText("stop service"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "stop button"); Main.this.stopService(intent); } }); linearLayout.addView(button); final TextView textView = new TextView(this); textView.setText(Integer.toString(i)); linearLayout.addView(textView); this.setContentView(linearLayout); LocalBroadcastManager.getInstance(this).registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Main.this.i = intent.getIntExtra(Main.EXTENDED_DATA_STATUS, 0); textView.setText(Integer.toString(Main.this.i)); } }, new IntentFilter(Main.BROADCAST_ACTION) ); } public static class MyService extends IntentService { private Handler mHandler; private int i = 1; private boolean done; public MyService() { super("MyService"); } @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "onHandleIntent"); this.i = intent.getIntExtra(Main.EXTENDED_DATA_STATUS, 0); this.done = false; while(!done) { Log.d(TAG, "while true"); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } LocalBroadcastManager.getInstance(this).sendBroadcast( new Intent(Main.BROADCAST_ACTION) .putExtra(Main.EXTENDED_DATA_STATUS, MyService.this.i)); this.i++; } } @Override public void onDestroy() { Log.d(TAG, "onDestroy"); this.done = true; super.onDestroy(); } } } 

Para baja precisión solamente. Podríamos obtener una mayor precisión al usar System.currentTimeMillis dentro onHandleIntent lugar de usar el valor entero, y reducir el tiempo de onHandleIntent para reducir la latencia.

Probado en Android 22. Texto estándar de construcción aquí .

En lugar de utilizar la vista de lista, simplemente use una vista de texto para el temporizador y 3 botones para detener el inicio y reiniciar. Usando estos puedes hacer el código de Java en consecuencia