From 8c65e50bfe3b90b96985c2d87b8c459c348af6aa Mon Sep 17 00:00:00 2001 From: Anthony Lee Date: Wed, 20 Aug 2014 13:59:59 -0700 Subject: [PATCH] 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 --- .../emailcommon/service/ServiceProxy.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java b/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java index 1c4f3b6bb..3669345c1 100644 --- a/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java +++ b/emailcommon/src/com/android/emailcommon/service/ServiceProxy.java @@ -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) {