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
This commit is contained in:
Danny Baumann 2015-06-17 09:24:25 +02:00 committed by Steve Kondik
parent c96099279b
commit a0ef884d04
1 changed files with 28 additions and 26 deletions

View File

@ -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<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 {