1

これが私のタイマークラスです。このクラスは、ビュー内のタイマーを常に更新するように設計されています。ただし、アプリを実行すると、最初のトーストメッセージが画面に表示されますが、2番目のメッセージに到達することはありません(timerTaskの「run」メソッドが実行されることはありません)。これはおそらく私が間違っている単純なことだと思います。誰かが私を正しい方向に導くことができれば、それは素晴らしいことです。

public class MyTimer  { 

static Timer _timerTask = new Timer();
static int totalSeconds = 1, hour = 0, min = 0, sec = 0;
static String mTimeFormat = "%02d:%02d:%02d";
static String timeTakenString;



public static void start (){
    Toast.makeText(GPSMain.context, "Message one", Toast.LENGTH_LONG).show();

    TimerTask timer = new TimerTask() {
        @Override
        public void run() {
            Toast.makeText(GPSMain.context, "Message two", Toast.LENGTH_LONG).show();
            totalSeconds += 1;
            sec += 1;
            if(sec >= 60) {
                sec = 0;
                min += 1;
                if (min >= 60) {
                    min = 0;
                    hour += 1;
                }
            }
            timeTakenString = String.format(mTimeFormat, hour, min, sec);
            postExecute.sendEmptyMessage(0); //update UI
        }
        private Handler postExecute = new Handler(){
            public void dispatchMessage(Message msg) {
                super.dispatchMessage(msg);
                GPSMain.timer.setText("Time Taken: "+timeTakenString);
            }
        };
    };
_timerTask.scheduleAtFixedRate(timer,1000,1000);
}
}

このクラスを呼び出す別のファイルのコード:

MyTimer myTimer = new MyTimer();
....
myTimer.start();

プロジェクトの仕様が変更されました!私のプロジェクトリーダーは、プロジェクトの仕様を変更して、タイマーをUIに更新する必要がなくなり、最終結果として表示するようにしました。それが元の問題を解決するので、とにかく最初の答えを受け入れる。以下に新しいコードを投稿します。

新しいコード呼び出し:

 System.currentTimeMillis();

実行サイクルの開始時と終了時に、longが返されます。次に、最初の値が2番目の値から差し引かれ、実行サイクルの実行にかかる時間が計算されます。次に、その値が操作され、最後に文字列として表示されるタイマー形式になります。

public static String getTimeTaken(long end, long start){
    @SuppressWarnings("unused")
    String formattedTime = "", hourHour = "", hourMin = ":", minSec = ":";
    long timeTaken = (end-start)/1000, hour = 0, min = 0, sec = 0;
    if (timeTaken>9 ){
        hourHour = "0";
        hourMin = ":0";
        if (timeTaken>=60){
            if (timeTaken>= 3200){
                hour = timeTaken/3200;
                timeTaken = timeTaken%3200;
                if (hour>9){
                    hourHour = "";
                }
            }
            min = timeTaken/60;
            timeTaken = timeTaken%60;
            if (min >9){
                hourMin = ":";
            }
        }
        sec = timeTaken;
        if(sec%60<10){
            minSec = ":0";
        }
        return formattedTime = (hourHour+hour+hourMin+min+minSec+sec);
    }
    sec = timeTaken;
    minSec = ":0";
    hourMin = ":0";
    hourHour = "0";
    return formattedTime = (hourHour+hour+hourMin+min+minSec+sec);
}
4

2 に答える 2

2

スレッドを使用すると、UI を更新できず、runOnUiThread を使用する必要があります

youractivity.this.runOnUiThread(new Runnable(){public void run(){Toast.makeText(mContext, "Message", Toast.LENGTH_LONG).show();}});
于 2011-07-19T11:15:13.777 に答える
0

(非常に遅くなりました...誰かがこの質問に到達した場合に備えて回答しています...タスクをスケジュールしても、適切な時間に実行されるとは限りません...時間がかかる場合があり、場合によってははるかに長くなる場合があります...)

于 2012-07-12T04:43:00.053 に答える