summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2015-06-17 09:24:25 +0200
committerDanny Baumann <dannybaumann@web.de>2015-06-18 12:45:19 +0200
commit8fc4de470514194dcbcff382f2be68478910404c (patch)
tree8f47d911066a437cc303a0de2571284452631858
parenta2383f878fb2f2f98208fc957d0eb3deb0dc2ebd (diff)
downloadandroid_packages_apps_Email-8fc4de470514194dcbcff382f2be68478910404c.tar.gz
android_packages_apps_Email-8fc4de470514194dcbcff382f2be68478910404c.tar.bz2
android_packages_apps_Email-8fc4de470514194dcbcff382f2be68478910404c.zip
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
-rw-r--r--provider_src/com/android/email/service/ImapService.java54
1 files 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 044a32593..779a5f679 100644
--- a/provider_src/com/android/email/service/ImapService.java
+++ b/provider_src/com/android/email/service/ImapService.java
@@ -509,43 +509,45 @@ public class ImapService extends Service {
}
}
}
- stopIdlingForFolders(foldersToStop);
+ stopIdlingForFoldersInBackground(foldersToStop);
}
private void unregisterAllIdledMailboxes(final boolean disconnect) {
- // Run away from the UI thread
+ final ArrayList<ImapFolder> 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<ImapFolder> folders) {
+ if (folders.isEmpty()) {
+ return;
+ }
sExecutor.execute(new Runnable() {
@Override
public void run() {
- final ArrayList<ImapFolder> 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<ImapFolder> folders) {
- for (ImapFolder folder : folders) {
- try {
- folder.stopIdling(true);
- } catch (MessagingException me) {
- // ignored
- }
- }
- }
}
private static class ImapEmailConnectivityManager extends EmailConnectivityManager {