Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将处理程序用作计时器,但可以';别停下来_Android_Multithreading_Handler - Fatal编程技术网

Android 将处理程序用作计时器,但可以';别停下来

Android 将处理程序用作计时器,但可以';别停下来,android,multithreading,handler,Android,Multithreading,Handler,我在2011年在这个论坛的一篇帖子中找到了下面粘贴的代码。我曾使用计时器触发doSomeWork的执行,但doSomeWork生成了一个异步任务,而且(我发现)异步任务只能从UI线程生成。因此,我转换为使用处理程序的postdayed函数 现在,这段代码确实每10秒调用一次doSomeWork,我的asynctask不再有问题。但是,当我调用stopRepeatingTask()时,它不会停止doSomeWork的执行,而是每十秒钟调用一次 此代码位于服务中,已调用stopSelf(),但代码仍

我在2011年在这个论坛的一篇帖子中找到了下面粘贴的代码。我曾使用计时器触发doSomeWork的执行,但doSomeWork生成了一个异步任务,而且(我发现)异步任务只能从UI线程生成。因此,我转换为使用处理程序的postdayed函数

现在,这段代码确实每10秒调用一次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 m_interval=5000;//默认情况下为5秒,可在以后更改
私有处理器m_处理器;
@凌驾
创建时受保护的void(捆绑){
// ...
m_handler=新处理程序();
}
Runnable m_statusChecker=new Runnable(){
@凌驾
公开募捐{
doSomeWork();//此函数可以更改m_间隔的值。
m_handler.postDelayed(m_statusChecker,m_interval);
}
};
void startRepeatingTask(){
m_statusChecker.run();
}
void stopRepeatingTask(){

m_handler.removeCallbacks(m_statusChecker);//向代码中添加状态以停止重新启动新任务:

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

向代码中添加状态以停止重新启动新任务:

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

建议的实现比它需要的复杂得多。相反,请看以下内容:基本上让stopRunning()设置一个布尔标志,并在postDelayed()之前检查该标志您不应该直接调用run。您应该将其包装在一个线程中,然后调用start。请阅读。建议的实现比它需要的复杂。相反,请看以下内容:基本上让stopRunning()设置一个布尔标志,并在postDelayed()之前检查该标志你不应该直接调用run。你应该将它包装在一个线程中,然后调用start。请阅读。注意,如果他在主线程中调用
removeCallbacks
,则不应该需要此操作。他可能有一个工作线程,试图从那里停止任务。或者他正在从
doSomeWork
调用此操作。注意如果他在主线程中调用
removeCallbacks
,则不需要。他可能有一个工作线程并试图从此处停止任务。或者他正在从
doSomeWork
调用该线程。