Reputation: 6970
i have this Handler:
private Runnable mRunnableReset = new Runnable() {
public void run() {
Log.i("MyApp", "mRunnableReset");
}
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(2000);
mHandler.post(mRunnableReset);
} catch (Exception e) {
// TODO: handle exception
}
}
}
};
I tried to use this code in my onDestroy() method
mHandler.removeCallbacks(mRunnableReset);
mHandler.removeCallbacksAndMessages(null);
but the mRunnable is still running (i can see the log in LogCat). If I use mRunnable.destroy() my app crashes.
How can i stop this ? Thank you.
Upvotes: 0
Views: 740
Reputation: 75629
Instead of using Thread.sleep()
use postDelayed()
while posting your Runnable (instead of regular post()
).
Upvotes: 1
Reputation: 67286
Whoops you are using
while(true){
Thread.sleep(2000);
mHandler.post(mRunnableReset);
}
How will it stop then? It won't.
Instead it should be like,
private Runnable mRunnableReset = new Runnable() {
public void run() {
Log.i("MyApp", "mRunnableReset");
mHandler.removeCallbacks(mRunnableReset);
mHandler.post(mRunnableReset);
}
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
public void run() {
try {
Thread.sleep(2000);
mHandler.post(mRunnableReset);
} catch (Exception e) {
// TODO: handle exception
}
}
};
And then to stop your mRunnableReset
use mHandler.removeCallbacks(mRunnableReset);
And better would be using mHandler.postDelayed(mRunnableReset, 2000)
instead of Thread.sleep(2000);
Also check my answer here to get complete working of how Handler will work.
Upvotes: 1