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;}}

但是,有一个问题。首先,我的方法设置文本并将一行写入日志文件,但是如果我使用上面的代码,则不会设置文本,但是所有信息都会自动写入日志文件。另一件事是我无法停止可运行 - 在它开始执行程序后,如果我尝试按下停止按钮,它似乎没有响应并崩溃。我做错了什么以及如何解决?

4

2 回答 2

2

不应该最后一行run()调用Handler.postDelayed()而不是Handler.postAtTime()

根据事件队列在 Android 中的实现方式,您可能会通过使用错误的线程来杀死线程……您基本上是在重复设置 Runnable 以在线程最初启动后 1 秒运行,因此没有其他事件可以运行。

于 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;
}


}

至于文字不更新我不是很明白,是不是在swing gui中没有设置?

编辑在运行方法的末尾添加了一个 Thread.sleep(1000)

由同行编辑:移动 Thread.Sleep(1000) 以便 Runnable 每秒运行一次直到停止(而不是连续运行,然后在停止后等待 1 秒)。

于 2010-10-22T11:54:07.577 回答