移动软件开发 实习五 使用线程

  1. 完成一个秒表,具备启停功能,正确使用工作线程完成界面刷新
  2. 分析秒表的计时是否准确,原因是什么,如何保证秒表计时准确

工程名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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值