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:
parent
c96099279b
commit
a0ef884d04
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue