Java 创建简单计时器android

Java 创建简单计时器android,java,android,timer,Java,Android,Timer,我想制作一个简单的计时器来计时用户在我的应用程序中执行某项操作所需的时间。我的想法是简单地启动计时器,停止计时器,然后显示时间。我一直在搜索,还没有找到一个确切的解决方案,只是工作。它是像我想象的那么简单,还是像我在搜索中发现的那样更复杂?计时器需要多精确 最简单的方法是在执行任务之前花费时间,然后从执行任务之后的时间中减去: long start = System.currentTimeMillis(); // do some task long timeTakenMs = System.cu

我想制作一个简单的计时器来计时用户在我的应用程序中执行某项操作所需的时间。我的想法是简单地启动计时器,停止计时器,然后显示时间。我一直在搜索,还没有找到一个确切的解决方案,只是工作。它是像我想象的那么简单,还是像我在搜索中发现的那样更复杂?

计时器需要多精确

最简单的方法是在执行任务之前花费时间,然后从执行任务之后的时间中减去:

long start = System.currentTimeMillis();
// do some task
long timeTakenMs = System.currentTimeMillis() - start;
如果您指的是用户事件驱动计时器,则可以应用与上述相同的原则:

// Declare instance variable
long start = 0L;

// OnStartTimer
start = System.currentTimeMillis();

// OnStopTimer
long elapsed = System.currentTimeMillis() - start;

您可以调整此示例:

AndroidTimerExample
设置
你好,世界!
00:00:00
暂停
开始
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.SystemClock;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
私人按钮开始按钮;
私人按钮暂停按钮;
私有文本视图时间值;
专用长启动时间=0L;
私有处理程序customHandler=新处理程序();
长时间单位毫秒=0L;
长时间WAPBUFF=0L;
长更新时间=0L;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timerValue=(TextView)findViewById(R.id.timerValue);
startButton=(按钮)findViewById(R.id.startButton);
startButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
startTime=SystemClock.uptimeMillis();
postDelayed(updateTimerThread,0);
}
});
pauseButton=(按钮)findViewById(R.id.pauseButton);
pauseButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
timeSwapBuff+=timein毫秒;
removeCallbacks(updateTimerThread);
}
});
}
private Runnable updateTimerThread=new Runnable(){
公开募捐{
timeinmillides=SystemClock.uptimeMillis()-startTime;
updatedTime=timeSwapBuff+Timein毫秒;
整数秒=(整数)(更新时间/1000);
整数分钟=秒/60;
秒=秒%60;
整数毫秒=(整数)(更新时间%1000);
timerValue.setText(“+mins+”:”
+字符串格式(“%02d”,秒)+”:
+格式(“%03d”,毫秒));
customHandler.postDelayed(这个,0);
}
};

}这是一个静态类,主要基于@Manolescu的答案,部分基于@Manolescu的答案。我不知道这是愚蠢还是好,但它在两个应用程序中对我有效:

import android.app.Activity;
import android.os.Handler;
import android.os.SystemClock;

public class Timer extends Activity {
    public static Handler customHandler     = new Handler();
    public static long startTime           ;
    public static long timeInMilliseconds  ;
    public static long timeSwapBuff        ;
    public static long updatedTime         ;
    public static String timerValue        ;

    Timer(){
        initTimeParams();
    }
    public static void startTimer(){
        startTime = SystemClock.uptimeMillis();
        customHandler.postDelayed(updateTimerThread, 0) ;
    }
    public static void pauseTimer(){
        timeSwapBuff += timeInMilliseconds;
        customHandler.removeCallbacks(updateTimerThread);
    }
    public static void resetTimer(){
        initTimeParams();
        displayTimer();
        customHandler = new Handler();
        pauseTimer();
    }
    public static Runnable updateTimerThread = new Runnable() {
        public void run() {
            timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
            updatedTime = timeSwapBuff + timeInMilliseconds;
            displayTimer();
            customHandler.postDelayed(this, 0) ;
        }
    };
    public static String displayTimer(){
        int secs = (int) (updatedTime / 1000) ;
        int mins = secs / 60;
        secs = secs % 60;
        int milliseconds = (int) (updatedTime % 1000) ;
        timerValue = ("" + mins + ":"
                + String.format("%02d", secs) + "."
                + String.format("%03d", milliseconds));
        return timerValue;
    }
    public static void initTimeParams(){
        startTime = 0L ;
        timeInMilliseconds = 0L;
        timeSwapBuff = 0L;
        updatedTime = 0L;
        timerValue = "00:00.000";
    }
}
下面是我如何在(相当蹩脚的)测试应用程序中使用它,但它也在Deitel的Android编程标志应用程序中完成了它的工作(总用户时间,不包括显示“正确”的时间)。(即,我启动、暂停、重新启动,并最终为下一个“测验”重置(未显示运行计时器):

以下是xml:

activity\u main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start"
        android:id="@+id/btnStart"
        android:onClick="start"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="152dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pause"
        android:id="@+id/btnPause"
        android:onClick="pause"
        android:layout_alignBottom="@+id/btnStart"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"
        android:id="@+id/btnReset"
        android:onClick="reset"
        android:layout_marginTop="92dp"
        android:layout_below="@+id/btnPause"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show timer"
        android:id="@+id/btnShowTime"
        android:onClick="showTime"
        android:layout_below="@+id/btnReset"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00.000"
        android:id="@+id/textView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:phoneNumber="true" />
</RelativeLayout>
<resources>
    <string name="app_name">TimerTestWithTimerAsClass</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
</resources>
<menu 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"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>
menu.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start"
        android:id="@+id/btnStart"
        android:onClick="start"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="152dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pause"
        android:id="@+id/btnPause"
        android:onClick="pause"
        android:layout_alignBottom="@+id/btnStart"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"
        android:id="@+id/btnReset"
        android:onClick="reset"
        android:layout_marginTop="92dp"
        android:layout_below="@+id/btnPause"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show timer"
        android:id="@+id/btnShowTime"
        android:onClick="showTime"
        android:layout_below="@+id/btnReset"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00.000"
        android:id="@+id/textView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:phoneNumber="true" />
</RelativeLayout>
<resources>
    <string name="app_name">TimerTestWithTimerAsClass</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
</resources>
<menu 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"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>


行,但如何正确格式化?这是我尝试的
time=System.currentTimeMillis()-seconds;SimpleDateFormat fmt=new SimpleDateFormat(“mm:ss”);String dateString=fmt.format(time)
而且它没有正确显示。它显示的是18:30,其他时间也一样high@ez4nick查看DateUtils API这些方法非常好用。