【问题标题】:Using Handler as a timer but can't stop it使用 Handler 作为计时器但无法停止
【发布时间】:2013-09-12 22:47:33
【问题描述】:

早在 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
}

【问题讨论】:

标签: android multithreading handler


【解决方案1】:

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

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

【讨论】:

  • 请注意,如果他在主线程中调用removeCallbacks,则不需要这样做。他可能有一个工作线程并试图从那里停止任务。或者也许他是从doSomeWork 打来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多