Pause in onPause()
Now, we need to arrange to have our thread stop running when the activity is paused (e.g., some other activity has taken over the screen). Since threads are relatively cheap to create and destroy, we can simply have our current running thread stop and start a fresh one, if needed, in onResume().
While there are some deprecated methods on Thread to try to forcibly terminate them, it is generally better to let the Thread stop itself by falling out of whatever processing loop it is in. So, what we want to do is let the background thread know the activity is not active.
To do this, first import java.util.concurrent.atomic.AtomicBoolean in LunchList and add an AtomicBoolean data member named isActive, initially set to true (new AtomicBoolean(true);).
Then, in the longTask Runnable, change the loop to also watch for the state of isActive, falling out of the loop if the activity is no longer active:
for (int i=progress;
i<10000 && isActive.get();
i+=200) {
doSomeLongWork(200);
}
Finally, implement onPause() to update the state of isActive:
@Override
public void onPause() {
super.onPause();
isActive.set(false);
}
Note how we chain to the superclass in onPause() – if we fail to do this, we will get a runtime error.
With this implementation, our background thread will run to completion or until isActive is false, whichever comes first.
While there are some deprecated methods on Thread to try to forcibly terminate them, it is generally better to let the Thread stop itself by falling out of whatever processing loop it is in. So, what we want to do is let the background thread know the activity is not active.
To do this, first import java.util.concurrent.atomic.AtomicBoolean in LunchList and add an AtomicBoolean data member named isActive, initially set to true (new AtomicBoolean(true);).
Then, in the longTask Runnable, change the loop to also watch for the state of isActive, falling out of the loop if the activity is no longer active:
for (int i=progress;
i<10000 && isActive.get();
i+=200) {
doSomeLongWork(200);
}
Finally, implement onPause() to update the state of isActive:
@Override
public void onPause() {
super.onPause();
isActive.set(false);
}
Note how we chain to the superclass in onPause() – if we fail to do this, we will get a runtime error.
With this implementation, our background thread will run to completion or until isActive is false, whichever comes first.
No comments:
Post a Comment