From 9310f3f6c69caa8b9651c61152947c844efa74be Mon Sep 17 00:00:00 2001 From: Daniel Applebaum Date: Tue, 20 Apr 2010 03:22:43 +0000 Subject: [PATCH] Fixes Issue 1441 Shutdown threadPool when Service is destroyed. --- src/com/fsck/k9/service/CoreService.java | 46 ++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/com/fsck/k9/service/CoreService.java b/src/com/fsck/k9/service/CoreService.java index 551b5d547..fd1d83c8b 100644 --- a/src/com/fsck/k9/service/CoreService.java +++ b/src/com/fsck/k9/service/CoreService.java @@ -20,8 +20,19 @@ public abstract class CoreService extends Service public static String WAKE_LOCK_ID = "com.fsck.k9.service.CoreService.wakeLockId"; private static ConcurrentHashMap wakeLocks = new ConcurrentHashMap(); private static AtomicInteger wakeLockSeq = new AtomicInteger(0); - private final ExecutorService threadPool = Executors.newFixedThreadPool(1); // Must be single threaded - + private ExecutorService threadPool = null; + private final String className = getClass().getName(); + + @Override + public void onCreate() + { + if (K9.DEBUG) + Log.i(K9.LOG_TAG, "CoreService: " + className + ".onCreate()"); + threadPool = Executors.newFixedThreadPool(1); // Must be single threaded + super.onCreate(); + + } + protected static void addWakeLockId(Intent i, Integer wakeLockId) { if (wakeLockId != null) @@ -42,6 +53,8 @@ public abstract class CoreService extends Service i.putExtra(WAKE_LOCK_ID, tmpWakeLockId); } + + @Override public void onStart(Intent intent, int startId) @@ -53,7 +66,7 @@ public abstract class CoreService extends Service wakeLock.acquire(K9.MAIL_SERVICE_WAKE_LOCK_TIMEOUT); if (K9.DEBUG) - Log.i(K9.LOG_TAG, "CoreService: " + this.getClass().getName() + ".onStart(" + intent + ", " + startId); + Log.i(K9.LOG_TAG, "CoreService: " + className + ".onStart(" + intent + ", " + startId); int wakeLockId = intent.getIntExtra(BootReceiver.WAKE_LOCK_ID, -1); if (wakeLockId != -1) @@ -91,12 +104,12 @@ public abstract class CoreService extends Service public void execute(Context context, final Runnable runner, int wakeLockTime, final Integer startId) { + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); final WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "K9"); wakeLock.setReferenceCounted(false); wakeLock.acquire(wakeLockTime); - if (K9.DEBUG) - Log.d(K9.LOG_TAG, "CoreService (" + getClass().getName() + ") queueing Runnable " + runner.hashCode() + " with startId " + startId); + Runnable myRunner = new Runnable() { public void run() @@ -105,13 +118,13 @@ public abstract class CoreService extends Service { if (K9.DEBUG) - Log.d(K9.LOG_TAG, "CoreService (" + getClass().getName() + ") running Runnable " + runner.hashCode() + " with startId " + startId); + Log.d(K9.LOG_TAG, "CoreService (" + className + ") running Runnable " + runner.hashCode() + " with startId " + startId); runner.run(); } finally { if (K9.DEBUG) - Log.d(K9.LOG_TAG, "CoreService (" + getClass().getName() + ") completed Runnable " + runner.hashCode() + " with startId " + startId); + Log.d(K9.LOG_TAG, "CoreService (" + className + ") completed Runnable " + runner.hashCode() + " with startId " + startId); wakeLock.release(); if (startId != null) { @@ -121,8 +134,20 @@ public abstract class CoreService extends Service } }; - - threadPool.execute(myRunner); + if (threadPool == null) + { + Log.e(K9.LOG_TAG, "CoreService.execute (" + className + ") called with no threadPool available; running Runnable " + runner.hashCode() + " in calling thread", new Throwable()); + synchronized(this) + { + myRunner.run(); + } + } + else + { + if (K9.DEBUG) + Log.d(K9.LOG_TAG, "CoreService (" + className + ") queueing Runnable " + runner.hashCode() + " with startId " + startId); + threadPool.execute(myRunner); + } } public abstract void startService(Intent intent, int startId); @@ -138,7 +163,8 @@ public abstract class CoreService extends Service public void onDestroy() { if (K9.DEBUG) - Log.i(K9.LOG_TAG, "CoreService: " + this.getClass().getName() + ".onDestroy()"); + Log.i(K9.LOG_TAG, "CoreService: " + className + ".onDestroy()"); + threadPool.shutdown(); super.onDestroy(); // MessagingController.getInstance(getApplication()).removeListener(mListener); }