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