b/17135753. Make sure to free ServiceConnection.

The only way that the ServiceConnection was not being freed is if
there was an Exception (other than RemoteException) being thrown
out of mTask.run(). Now the call to unbindService() is called
in a finally() block surrounding that block of code.

Change-Id: I597412233381894be76d3c8bdf99fc7d96794dc2
This commit is contained in:
Anthony Lee 2014-08-20 13:59:59 -07:00
parent b04201335c
commit 8c65e50bfe
1 changed files with 18 additions and 13 deletions

View File

@ -114,19 +114,24 @@ public abstract class ServiceProxy {
try {
mTask.run();
} catch (RemoteException e) {
}
try {
// Each ServiceProxy handles just one task, so we unbind after we're
// done with our work.
mContext.unbindService(mConnection);
} catch (RuntimeException e) {
// The exceptions that are thrown here look like IllegalStateException,
// IllegalArgumentException and RuntimeException. Catching RuntimeException
// which get them all. Reasons for these exceptions include services that
// have already been stopped or unbound. This can happen if the user ended
// the activity that was using the service. This is harmless, but we've got
// to catch it.
LogUtils.e(mTag, e, "RuntimeException when trying to unbind from service");
LogUtils.e(mTag, e, "RemoteException thrown running mTask!");
} finally {
// Make sure that we unbind the mConnection even on exceptions in the
// task provided by the subclass.
try {
// Each ServiceProxy handles just one task, so we unbind after we're
// done with our work.
mContext.unbindService(mConnection);
} catch (RuntimeException e) {
// The exceptions that are thrown here look like IllegalStateException,
// IllegalArgumentException and RuntimeException. Catching
// RuntimeException which get them all. Reasons for these exceptions
// include services that have already been stopped or unbound. This can
// happen if the user ended the activity that was using the service.
// This is harmless, but we've got to catch it.
LogUtils.e(mTag, e,
"RuntimeException when trying to unbind from service");
}
}
mTaskCompleted = true;
synchronized(mConnection) {