Тема: Секундомір
Писав секундомір різними способами але завжди виникає не точність підрахунку часу. Цей після 2 хвилин роботи відстає на 0.8 секунди.
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class MainActivity extends AppCompatActivity {
Button start,stop;
TextView timenow, textView;
int min=0, activ=0, sec=0, sn=0, mn=0, hn=0, g=1;
String secs, mins,mss, sns,mns,hns;
long time0=0, time=0,ms=0,reserv=0;
public Handler tmn=new Handler();
public Runnable TmnUp=new Runnable()
{
@Override
public void run()
{
Calendar cal=new GregorianCalendar();
hn=cal.get(Calendar.HOUR);
mn=cal.get(Calendar.MINUTE);
sn=cal.get(Calendar.SECOND);
if (hn<10) hns="0"+Integer.toString(hn); else
hns=Integer.toString(hn);
if (mn<10) mns="0"+Integer.toString(mn); else
mns=Integer.toString(mn);
if (sn<10) sns="0"+Integer.toString(sn); else
sns=Integer.toString(sn);
timenow.setText(hns + ":" + mns + ":" + sns);
tmn.postDelayed(TmnUp,50);
}
};
protected void onPause()
{
mh.removeCallbacks(TimeUpdater);
start.setText("Старт");
super.onPause();
}
private Handler mh=new Handler();
private Runnable TimeUpdater=new Runnable()
{
@SuppressLint("SetTextI18n")
@Override
public void run() {
Date d=new Date();
time=d.getTime();
ms=time-time0;
if (ms>=1000)
{
ms=0;
time0=time;
sec++;
}
if (sec==60)
{
sec=0;
min++;
}
if (ms<10) mss="00"+String.valueOf(ms); else mss=String.valueOf(ms);
if ((ms<100) && (ms>10)) mss="0"+String.valueOf(ms); else mss=String.valueOf(ms);
if ((ms<1000) && (ms>100)) mss=String.valueOf(ms);
if (sec<10) secs="0"+String.valueOf(sec); else secs=String.valueOf(sec);
if (min<10) mins="0"+String.valueOf(min); else mins=String.valueOf(min);
textView.setText(mins+":"+secs+"."+mss);
mh.postDelayed(this, g);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start=(Button) findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
textView=(TextView) findViewById(R.id.textView);
timenow=(TextView) findViewById(R.id.timenow);
tmn.removeCallbacks(TmnUp);
tmn.postDelayed(TmnUp,1);
stop.setOnClickListener(new View.OnClickListener() {
@SuppressLint("SetTextI18n")
@Override
public void onClick(View v) {
onPause();
textView.setText("00:00.000");
min = 0;
sec = 0;
ms=0;
time0=0;
time=0;
reserv=0;
start.setText("СТАРТ");
activ = 0;
}
});
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (activ == 0) {
Date date=new Date();
time0=date.getTime()-reserv;
mh.removeCallbacks(TimeUpdater);
mh.postDelayed(TimeUpdater, g);
start.setText("Пауза");
activ = 1;
} else if (activ == 1) {
onPause();
reserv=ms;
activ = 0;
}
}
});
}
}