我在2011年在该论坛上的帖子中发现了以下粘贴的代码。我使用计时器触发doSomeWork的执行,但是doSomeWork产生了一个asynctask,并且(据我所知)asynctasks只能从UI线程中产生。因此,我转换为使用Handler的postDelayed函数。

现在,此代码确实每十秒钟调用一次doSomeWork,而我的asynctask不再有问题。但是,当我调用stopRepeatingTask()时,它不会停止doSomeWork的执行-它每十秒钟不断被调用一次。

此代码在服务中,已经调用了stopSelf(),但代码仍在运行。 Android系统甚至没有将服务显示为正在运行,但仍在调用doSomeWork。

怎么了?我该如何阻止它?
谢谢,加里

private int m_interval = 5000; // 5 seconds by default, can be changed later
private Handler m_handler;

@Override
protected void onCreate(Bundle bundle) {
  // ...
  m_handler = new Handler();
}

Runnable m_statusChecker = new Runnable() {
     @Override
     public void run() {
          doSomeWork(); //this function can change value of m_interval.
          m_handler.postDelayed(m_statusChecker, m_interval);
     }
};

void startRepeatingTask() {
    m_statusChecker.run();
}

void stopRepeatingTask() {
    m_handler.removeCallbacks(m_statusChecker); //  <--this does not appear to work
}

最佳答案

向您的代码添加状态以停止重新生成新任务:

private int mInterval = 5000; // 5 seconds by default, can be changed later
private Handler mHandler;
private boolean mIsRunning;

protected void onCreate(Bundle bundle) {
  // ...
  mHandler = new Handler();
}

Runnable mStatusChecker = new Runnable() {
     @Override
     public void run() {
          if (!mIsRunning) {
              return; // stop when told to stop
          }
          doSomeWork(); // this function can change value of mInterval.
          mHandler.postDelayed(mStatusChecker, mInterval);
     }
};

void startRepeatingTask() {
    mIsRunning = true;
    mStatusChecker.run();
}

void stopRepeatingTask() {
    mIsRunning = false;
    mHandler.removeCallbacks(mStatusChecker);
}

08-05 12:21