Fixed lifecycle threading

pull/153/head
M66B 7 years ago
parent 983933568c
commit f40a9f96df

@ -508,7 +508,7 @@ public class ServiceSynchronize extends LifecycleService {
final Map<EntityFolder, IMAPFolder> folders = new HashMap<>(); final Map<EntityFolder, IMAPFolder> folders = new HashMap<>();
List<Thread> idlers = new ArrayList<>(); List<Thread> idlers = new ArrayList<>();
List<TwoStateOwner> owners = new ArrayList<>(); final List<TwoStateOwner> cowners = new ArrayList<>();
try { try {
// Listen for store events // Listen for store events
istore.addStoreListener(new StoreListener() { istore.addStoreListener(new StoreListener() {
@ -841,12 +841,12 @@ public class ServiceSynchronize extends LifecycleService {
} else } else
folders.put(folder, null); folders.put(folder, null);
final TwoStateOwner owner = new TwoStateOwner(ServiceSynchronize.this, folder.name); final TwoStateOwner cowner = new TwoStateOwner(ServiceSynchronize.this, folder.name);
new Handler(getMainLooper()).post(new Runnable() { new Handler(getMainLooper()).post(new Runnable() {
@Override @Override
public void run() { public void run() {
db.operation().liveOperations(folder.id).observe(owner, new Observer<List<EntityOperation>>() { db.operation().liveOperations(folder.id).observe(cowner, new Observer<List<EntityOperation>>() {
private List<Long> handling = new ArrayList<>(); private List<Long> handling = new ArrayList<>();
private final ExecutorService folderExecutor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); private final ExecutorService folderExecutor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory);
private final PowerManager.WakeLock wlFolder = pm.newWakeLock( private final PowerManager.WakeLock wlFolder = pm.newWakeLock(
@ -928,11 +928,11 @@ public class ServiceSynchronize extends LifecycleService {
} }
} }
}); });
cowner.start();
} }
}); });
owner.start(); cowners.add(cowner);
owners.add(owner);
} }
// Keep alive alarm receiver // Keep alive alarm receiver
@ -1014,10 +1014,15 @@ public class ServiceSynchronize extends LifecycleService {
db.account().setAccountError(account.id, Helper.formatThrowable(ex)); db.account().setAccountError(account.id, Helper.formatThrowable(ex));
} finally { } finally {
// Stop watching for operations // Stop watching for operations
for (TwoStateOwner owner : owners) new Handler(getMainLooper()).post(new Runnable() {
owner.stop(); @Override
owners.clear(); public void run() {
for (TwoStateOwner owner : cowners)
owner.stop();
}
});
// Update state
EntityLog.log(this, account.name + " closing"); EntityLog.log(this, account.name + " closing");
db.account().setAccountState(account.id, "closing"); db.account().setAccountState(account.id, "closing");
for (EntityFolder folder : folders.keySet()) for (EntityFolder folder : folders.keySet())
@ -1041,6 +1046,7 @@ public class ServiceSynchronize extends LifecycleService {
state.join(idler); state.join(idler);
idlers.clear(); idlers.clear();
// Update state
for (EntityFolder folder : folders.keySet()) for (EntityFolder folder : folders.keySet())
if (folder.synchronize && !folder.poll) if (folder.synchronize && !folder.poll)
db.folder().setFolderState(folder.id, null); db.folder().setFolderState(folder.id, null);

Loading…
Cancel
Save