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