From 025e9c48ed8d4ad297b59270e2160929c79e4fba Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 8 Sep 2018 08:43:13 +0000 Subject: [PATCH] Workaround for hanging JavaMail close --- .../eu/faircode/email/ServiceSynchronize.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index aac5d83a..afc76fab 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -126,6 +126,7 @@ public class ServiceSynchronize extends LifecycleService { 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 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 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()) db.folder().setFolderState(folder.id, "closing"); 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 { EntityLog.log(this, account.name + " closed"); db.account().setAccountState(account.id, null);