1

このコードを使用して、一定期間後にメソッドを実行するようにアドバイスされました。少し変更したところ、次のようになりました。

private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        final long start = mStartTime;

        // Get the difference in ms
        long millis = SystemClock.uptimeMillis() - start;

        // Format to hours/minutes/seconds
        int mTimeInSec = (int) (millis / 1000);

        // Do your thing

        Location location = tracker.getLastKnownLocation(best);
        RetrieveAvgPower(location);

        // Update at the next second
        mHandler.postAtTime(this, 1000);//start + ((mTimeInSec + 10) * 1000));
    }
};

そして、私はそれを開始して停止しようとします:

public void onClick(View v) {
         switch (v.getId()) {
            case R.id.start:
                    mStartTime = System.currentTimeMillis();
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    mHandler.postDelayed(mUpdateTimeTask, 1000);
                    break;
                case R.id.stop:
                    mHandler.removeCallbacks(mUpdateTimeTask);
                    break;}}

ただし、問題があります。まず、私のメソッドはテキストを設定し、ログ ファイルに行を書き込みますが、上記のコードを使用すると、テキストは設定されませんが、すべての情報がログ ファイルに自動的に書き込まれます。もう1つのことは、ランナブルを停止できないことです-実行を開始した後、プログラムが応答していないようで、停止ボタンを押そうとするとクラッシュします。私は何が間違っていて、どうすれば解決できますか?

4

2 に答える 2

2

ではなく、run()呼び出しの最後の行ではありませんか?Handler.postDelayed()Handler.postAtTime()

Android でイベント キューがどのように実装されているかによっては、間違ったスレッドを使用してスレッドを強制終了している可能性があります...基本的に、スレッドが最初に開始されてから 1 秒後に Runnable を実行するように繰り返し設定しているため、他のイベントは実行されません。

于 2010-10-22T11:46:19.250 に答える
1

ランナブルを停止するには、次のようなものを追加します。

class A implements Runnable
{
private volatile boolean runTask = false;

public void run()
{
   runTask = true;
   while(runTask)
   {
      // Do your thing
      Thread.sleep(1000); // wait 1 second before "Do your thing" again
   }
}


public void stop()
{
   runTask = false;
}


}

更新されていないテキストについてはよくわかりませんでしたが、設定されていないのはスイングGUIですか?

編集runメソッドの最後にThread.sleep(1000)を追加しました

ピアによる編集:Thread.Sleep(1000)を移動して、Runnableが停止するまで1秒に1回実行されるようにしました(継続的に実行して停止してから1秒待つのではなく)。

于 2010-10-22T11:54:07.577 に答える