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) {
|
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() {
|
sExecutor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
final ArrayList<ImapFolder> foldersToStop = new ArrayList<>();
|
for (ImapFolder folder : folders) {
|
||||||
synchronized (mIdledFolders) {
|
try {
|
||||||
LogUtils.i(LOG_TAG, "Unregister all idle mailboxes");
|
folder.stopIdling(true);
|
||||||
|
} catch (MessagingException me) {
|
||||||
if (disconnect) {
|
// ignored
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
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 {
|
private static class ImapEmailConnectivityManager extends EmailConnectivityManager {
|
||||||
|
|
Loading…
Reference in New Issue