0

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.

enfix
  • 6,680
  • 12
  • 55
  • 80

2 Answers2

1

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.

Community
  • 1
  • 1
Lalit Poptani
  • 67,150
  • 23
  • 161
  • 242
1

Instead of using Thread.sleep() use postDelayed() while posting your Runnable (instead of regular post()).

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141