- 完成一个秒表,具备启停功能,正确使用工作线程完成界面刷新
- 分析秒表的计时是否准确,原因是什么,如何保证秒表计时准确
工程名Timer
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.timer">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MainService">
</service>
</application>
</manifest>
MainActivity.java
package com.example.administrator.timer;
import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.text.NumberFormat;
public class MainActivity extends AppCompatActivity {
private static TextView tv_minute, tv_second,tv_msecond;
private Button btn_clear, btn_start, btn_stop;
public static Handler handler = new Handler();
public static int minute, second,msecond;
public static void UpadteGUI(int m, int s,int ms) {
minute = m;
second = s;
msecond = ms;
handler.post(RefreshLable);
}
private static Runnable RefreshLable = new Runnable() {
@Override
public void run() {
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(2);
tv_minute.setText(nf.format(minute));
tv_second.setText(nf.format(second));
tv_msecond.setText(nf.format(msecond));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_minute = (TextView) findViewById(R.id.tv_minute);
tv_second = (TextView) findViewById(R.id.tv_second);
tv_msecond = (TextView)findViewById(R.id.tv_msecond);
btn_clear = (Button) findViewById(R.id.btn_clear);
btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);
final Intent intent = new Intent(this, MainService.class);
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
btn_clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_minute.setText("00");
tv_second.setText("00");
tv_msecond.setText("00");
stopService(intent);
}
});
btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}
}
MainService.java
package com.example.administrator.timer;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
public class MainService extends Service {
private Thread workthread;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
workthread = new Thread(null, backgroudWork, "workThread");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if (!workthread.isAlive()) {
workthread.start();
}
}
@Override
public void onDestroy() {
super.onDestroy();
workthread.interrupt();
}
private Runnable backgroudWork = new Runnable() {
@Override
public void run() {
LayoutInflater layoutInflater = LayoutInflater.from(MainService.this);
View view = layoutInflater.inflate(R.layout.activity_main, null);
TextView tv_minute = view.findViewById(R.id.tv_minute);
TextView tv_second = view.findViewById(R.id.tv_second);
TextView tv_msecond = view.findViewById(R.id.tv_msecond);
int minute = Integer.parseInt(tv_minute.getText().toString());
int second = Integer.parseInt(tv_second.getText().toString());
int msecond = Integer.parseInt(tv_msecond.getText().toString());
while (true) {
try {
Thread.sleep(10);
msecond++;
if (msecond >= 100) {
second++;
msecond = 0;
if (second >= 60) {
minute++;
second = 0;
if ( minute>= 60) {
second = 0;
}
}
}
MainActivity.UpadteGUI( minute,second,msecond);
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}
};
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="8"
android:orientation="vertical"
android:background="#eceded"
tools:context="com.example.administrator.timer.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="秒 表"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:gravity="center">
<TextView
android:id="@+id/tv_minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="00"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text=":"/>
<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="00"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text=":"/>
<TextView
android:id="@+id/tv_msecond"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="00"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:gravity="center"
android:weightSum="4">
<Button
android:id="@+id/btn_clear"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="清零"
android:layout_marginLeft="5sp"
android:layout_marginRight="5sp"
android:background="#3f51b4"
android:textColor="#ffffff"
android:textSize="16sp"/>
<Button
android:id="@+id/btn_start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="计时"
android:background="#3f51b4"
android:textColor="#ffffff"
android:layout_marginLeft="5sp"
android:layout_marginRight="5sp"
android:textSize="16sp"/>
<Button
android:id="@+id/btn_stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止"
android:background="#3f51b4"
android:textColor="#ffffff"
android:layout_marginLeft="5sp"
android:layout_marginRight="5sp"
android:textSize="16sp"/>
</LinearLayout>
</LinearLayout>