0

I have a simple stopwatch code piece. Thread is running in custom class, it connects to the main activity via Interface

public class MainActivity extends AppCompatActivity implements MainActivityInteractionInterface{
public static boolean isRunning = false;
Stopwatch stopWatch;
private TextView textViewMilliSeconds;
private TextView textViewSeconds;
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textViewMilliSeconds = findViewById(R.id.textViewStopwatchMilliseconds);
 textViewSeconds = findViewById(R.id.textViewStopwatchSeconds);
 stopWatch = new Stopwatch(this, getApplicationContext());
 stopWatch.runThread();
}
@Override
public void updateUI() {
 String time = String.format(Locale.getDefault(), "%03d", stopWatch.getMilliseconds());
 textViewMilliSeconds.setText(time);
 String timeSeconds = String.format(Locale.getDefault(), "%02d", stopWatch.getSeconds());
 textViewSeconds.setText(timeSeconds);
}
public void startTimer(View view) {
 isRunning = !isRunning;
}

public class Stopwatch {
private int milliseconds = 0;
private int seconds = 0;
public int getMilliseconds() {
 return milliseconds;
}
public int getSeconds() {
 return seconds;
}
private MainActivityInteractionInterface interactionInterface;
private Context applicationContext;
public Stopwatch(MainActivityInteractionInterface interactionInterface, Context applicationContext){
 this.interactionInterface = interactionInterface;
 this.applicationContext = applicationContext;
}
public void runThread(){
 final Handler handler = new Handler();
 handler.post(new Runnable(){
 @Override
 public void run(){
 if(isRunning) {
 milliseconds++;
 if (milliseconds == 1000) {
 milliseconds = 0;
 seconds++;
 if(seconds == 60){
 seconds = 0;
 }
 }
 }
 interactionInterface.updateUI();
 handler.postDelayed(this, 1);
 }
 });
}

handler should update every 1 millisec, when there is 1000 milliseconds, 1 second passes by If I set handler.postDelayed delay anything below 15 reaching 1000 milliseconds would take exactly 18 seconds, why?

asked Apr 5, 2020 at 12:10

2 Answers 2

1

I don't know why it would take up to 18seconds, but I can tell you this: Android refresh the UI every 16msec (to have a rate of 60fps), so setting the handler to updateUI in a lesser time would make no sense and maybe also interfier with it.

In my humble opinion, make it to update in 20msec and change the counter values according, like this:

handler.post(new Runnable(){
 @Override
 public void run(){
 if(isRunning) {
 milliseconds++;
 if (milliseconds == 50) {
 milliseconds = 0;
 seconds++;
 if(seconds == 60){
 seconds = 0;
 }
 }
 }
 interactionInterface.updateUI();
 handler.postDelayed(this, 20);
 }
});
answered Apr 5, 2020 at 12:29
Sign up to request clarification or add additional context in comments.

Comments

0

Look at the second argument of handler.postDelayed(this, 1);

Change it according to the way you increment your milliseconds.

answered Apr 5, 2020 at 12:25

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.