From a0ef884d0499d8b9e031ef10ecc1bec43b3cad4f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Wed, 17 Jun 2015 09:24:25 +0200 Subject: [PATCH] Refine thread handling. Remove mailboxes from the list synchronously and just do the network I/O and thread joins in the background. Change-Id: I2a339e5982c103b69f1212627f1cc98e98a8a068 --- .../android/email/service/ImapService.java | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/provider_src/com/android/email/service/ImapService.java b/provider_src/com/android/email/service/ImapService.java index 52ba306d3..4396c532e 100644 --- a/provider_src/com/android/email/service/ImapService.java +++ b/provider_src/com/android/email/service/ImapService.java @@ -510,43 +510,45 @@ public class ImapService extends Service { } } } - stopIdlingForFolders(foldersToStop); + stopIdlingForFoldersInBackground(foldersToStop); } private void unregisterAllIdledMailboxes(final boolean disconnect) { - // Run away from the UI thread + final ArrayList foldersToStop = new ArrayList<>(); + synchronized (mIdledFolders) { + LogUtils.i(LOG_TAG, "Unregister all idle mailboxes"); + + if (disconnect) { + int count = mIdledFolders.size(); + for (int i = 0; i < count; i++) { + ImapFolder folder = mIdledFolders.get(mIdledFolders.keyAt(i)); + if (folder != null && folder.isIdling()) { + foldersToStop.add(folder); + } + } + } + mIdledFolders.clear(); + } + stopIdlingForFoldersInBackground(foldersToStop); + } + + private void stopIdlingForFoldersInBackground(final List folders) { + if (folders.isEmpty()) { + return; + } sExecutor.execute(new Runnable() { @Override public void run() { - final ArrayList foldersToStop = new ArrayList<>(); - synchronized (mIdledFolders) { - LogUtils.i(LOG_TAG, "Unregister all idle mailboxes"); - - if (disconnect) { - int count = mIdledFolders.size(); - for (int i = 0; i < count; i++) { - ImapFolder folder = mIdledFolders.get(mIdledFolders.keyAt(i)); - if (folder != null && folder.isIdling()) { - foldersToStop.add(folder); - } - } + for (ImapFolder folder : folders) { + try { + folder.stopIdling(true); + } catch (MessagingException me) { + // ignored } - mIdledFolders.clear(); } - stopIdlingForFolders(foldersToStop); } }); } - - private void stopIdlingForFolders(final List folders) { - for (ImapFolder folder : folders) { - try { - folder.stopIdling(true); - } catch (MessagingException me) { - // ignored - } - } - } } private static class ImapEmailConnectivityManager extends EmailConnectivityManager {