0

ユーザーがアプリで何かを実行するのにかかる時間を計る簡単なタイマーを作成したいと考えています。私が念頭に置いているのは、単にタイマーを開始し、タイマーを停止してから時間を表示することです。私は検索してきましたが、うまくいく決定的な解決策を見つけていません。それは私が想像するほど単純ですか、それとも私が検索して見つけたより複雑ですか?

4

3 に答える 3

2

タイマーはどれくらい正確である必要がありますか?

最も簡単な方法は、タスクを実行する前に時間を取り、タスクを実行した後の時間から差し引くことです。

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;
于 2013-07-17T16:04:08.377 に答える
0

これは、主にこのリンクに基づいた静的クラスであり、@Manolescu からの回答に部分的に基づいています。それがばかげているのか良いのかはわかりませんが、2つのアプリでうまくいきました:

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プログラミングフラグアプリでも機能しました(「正しい」を表示するのに費やされた時間を除く合計ユーザー時間)。(つまり、開始、一時停止、再起動し、最終的に次の「クイズ」のためにリセットしました (実行中のタイマーは表示されません):

    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;


    public class MainActivity extends Activity {

        Button btnStart, btnPause, btnReset, btnShowTime;
        TextView time;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnStart = (Button)findViewById(R.id.btnStart);
            btnPause = (Button)findViewById(R.id.btnPause);
            btnReset = (Button)findViewById(R.id.btnReset);
            btnShowTime = (Button)findViewById(R.id.btnShowTime);
            time = (TextView)findViewById(R.id.textView);
        }
        public void start(View view) {
            Timer.startTimer();
        }
        public void pause(View view) {
            Timer.pauseTimer();
            showTime(view);
        }
        public void reset(View view) {
            Timer.resetTimer();
            showTime(view);
        }
        public void showTime(View view) {
            time.setText(Timer.displayTimer());
        }
    }

xml は次のとおりです。

activity_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>

strings.xml

<resources>
    <string name="app_name">TimerTestWithTimerAsClass</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
</resources>

menu.xml

<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>
于 2015-06-25T17:21:43.913 に答える
0

この例を適応させることができます:

<string name="app_name">AndroidTimerExample</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="timerVal">00:00:00</string>
<string name="pauseButtonLabel">Pause</string>
<string name="startButtonLabel">Start</string>
 </resources>


  import android.app.Activity;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.SystemClock;
  import android.view.View;
  import android.widget.Button;
  import android.widget.TextView;

  public class MainActivity extends Activity {

private Button startButton;
private Button pauseButton;

private TextView timerValue;

private long startTime = 0L;

private Handler customHandler = new Handler();

long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    timerValue = (TextView) findViewById(R.id.timerValue);

    startButton = (Button) findViewById(R.id.startButton);

    startButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            startTime = SystemClock.uptimeMillis();
            customHandler.postDelayed(updateTimerThread, 0);

        }
    });

    pauseButton = (Button) findViewById(R.id.pauseButton);

    pauseButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {

            timeSwapBuff += timeInMilliseconds;
            customHandler.removeCallbacks(updateTimerThread);

        }
    });

}

private Runnable updateTimerThread = new Runnable() {

    public void run() {

        timeInMilliseconds = SystemClock.uptimeMillis() - startTime;

        updatedTime = timeSwapBuff + timeInMilliseconds;

        int secs = (int) (updatedTime / 1000);
        int mins = secs / 60;
        secs = secs % 60;
        int milliseconds = (int) (updatedTime % 1000);
        timerValue.setText("" + mins + ":"
                + String.format("%02d", secs) + ":"
                + String.format("%03d", milliseconds));
        customHandler.postDelayed(this, 0);
    }

};

}

于 2013-07-17T16:04:42.283 に答える