Browse Source

Workaround for hanging JavaMail close

main
M66B 6 years ago
parent
commit
025e9c48ed
1 changed files with 20 additions and 4 deletions
  1. +20
    -4
      app/src/main/java/eu/faircode/email/ServiceSynchronize.java

+ 20
- 4
app/src/main/java/eu/faircode/email/ServiceSynchronize.java View File

@ -126,6 +126,7 @@ public class ServiceSynchronize extends LifecycleService {
private static final int CONNECT_BACKOFF_START = 8; // seconds private static final int CONNECT_BACKOFF_START = 8; // seconds
private static final int CONNECT_BACKOFF_MAX = 1024; // seconds (1024 sec ~ 17 min) private static final int CONNECT_BACKOFF_MAX = 1024; // seconds (1024 sec ~ 17 min)
private static final long STORE_NOOP_INTERVAL = 9 * 60 * 1000L; // ms private static final long STORE_NOOP_INTERVAL = 9 * 60 * 1000L; // ms
private static final long STORE_CLOSE_TIMEOUT = 20 * 1000L; // ms
private static final int ATTACHMENT_AUTO_DOWNLOAD_SIZE = 32 * 1024; // bytes private static final int ATTACHMENT_AUTO_DOWNLOAD_SIZE = 32 * 1024; // bytes
static final String ACTION_SYNCHRONIZE_FOLDER = BuildConfig.APPLICATION_ID + ".SYNCHRONIZE_FOLDER"; static final String ACTION_SYNCHRONIZE_FOLDER = BuildConfig.APPLICATION_ID + ".SYNCHRONIZE_FOLDER";
@ -792,10 +793,25 @@ public class ServiceSynchronize extends LifecycleService {
for (EntityFolder folder : folders.keySet()) for (EntityFolder folder : folders.keySet())
db.folder().setFolderState(folder.id, "closing"); db.folder().setFolderState(folder.id, "closing");
try { try {
// This can take some time
istore.close();
} catch (MessagingException ex) {
Log.w(Helper.TAG, account.name + " " + ex + "\n" + Log.getStackTraceString(ex));
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
EntityLog.log(ServiceSynchronize.this, account.name + " store closing");
istore.close();
EntityLog.log(ServiceSynchronize.this, account.name + " store closed");
} catch (Throwable ex) {
Log.w(Helper.TAG, account.name + " " + ex + "\n" + Log.getStackTraceString(ex));
}
}
});
t.start();
try {
t.join(STORE_CLOSE_TIMEOUT);
} catch (InterruptedException ex) {
Log.w(Helper.TAG, account.name + " Close timeout");
t.interrupt();
}
} finally { } finally {
EntityLog.log(this, account.name + " closed"); EntityLog.log(this, account.name + " closed");
db.account().setAccountState(account.id, null); db.account().setAccountState(account.id, null);


Loading…
Cancel
Save