diff --git a/app/src/debug/java/eu.faircode.email/CoalMine.java b/app/src/debug/java/eu.faircode.email/CoalMine.java index ced49b6406..387c38deea 100644 --- a/app/src/debug/java/eu.faircode.email/CoalMine.java +++ b/app/src/debug/java/eu.faircode.email/CoalMine.java @@ -71,6 +71,12 @@ public class CoalMine { reporter.getLabels().add("started=" + label); } } + HeapField hfDestroyed = instance.get(className, "destroyed"); + if (hfDestroyed != null) { + Boolean destroyed = hfDestroyed.getValue().getAsBoolean(); + if (destroyed != null) + reporter.getLabels().add("destroyed=" + destroyed); + } } else if (className.equals(TwoStateOwner.class.getName())) { HeapField hfState = instance.get(className, "state"); if (hfState != null) { diff --git a/app/src/main/java/eu/faircode/email/SimpleTask.java b/app/src/main/java/eu/faircode/email/SimpleTask.java index 2f86e6f73b..95bb81fc3e 100644 --- a/app/src/main/java/eu/faircode/email/SimpleTask.java +++ b/app/src/main/java/eu/faircode/email/SimpleTask.java @@ -49,10 +49,10 @@ import java.util.concurrent.Future; public abstract class SimpleTask implements LifecycleObserver { private boolean log = true; private boolean count = true; - private boolean optional = false; private String name; private long started; + private boolean destroyed; private boolean reported; private Lifecycle.State state; private Future future; @@ -79,11 +79,6 @@ public abstract class SimpleTask implements LifecycleObserver { return this; } - public SimpleTask setOptional(boolean optional) { - this.optional = optional; - return this; - } - public SimpleTask setExecutor(ExecutorService executor) { this.localExecutor = executor; return this; @@ -153,8 +148,7 @@ public abstract class SimpleTask implements LifecycleObserver { LifecycleObserver watcher = new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestroy() { - EntityLog.log(context, EntityLog.Type.Debug, "Cancelling task=" + name); - cancel(context); + destroyed = true; owner.getLifecycle().removeObserver(this); } }; @@ -197,8 +191,7 @@ public abstract class SimpleTask implements LifecycleObserver { // No delivery cleanup(context); } else { - if (optional) - owner.getLifecycle().removeObserver(watcher); + owner.getLifecycle().removeObserver(watcher); if (state.isAtLeast(Lifecycle.State.RESUMED)) { // Inline delivery @@ -269,12 +262,15 @@ public abstract class SimpleTask implements LifecycleObserver { } }); - if (optional) - owner.getLifecycle().addObserver(watcher); + owner.getLifecycle().addObserver(watcher); updateTaskCount(context); } + public boolean isAlive() { + return !this.destroyed; + } + void cancel(Context context) { if (future != null && future.cancel(false)) { Log.i("Cancelled task=" + name); diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index cbd8cca5e5..9f7db5a143 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -273,14 +273,6 @@ public class ViewModelMessages extends ViewModel { return; } - ObjectHolder alive = new ObjectHolder<>(true); - owner.getLifecycle().addObserver(new LifecycleObserver() { - @OnLifecycleEvent(Lifecycle.Event.ON_ANY) - public void onAny() { - alive.value = owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED); - } - }); - Log.i("Observe previous/next id=" + id); //model.list.getValue().loadAround(lpos); model.list.observe(owner, new Observer>() { @@ -354,6 +346,9 @@ public class ViewModelMessages extends ViewModel { long id = args.getLong("id"); int lpos = args.getInt("lpos"); + if (!isAlive()) + return null; + PagedList plist = model.list.getValue(); if (plist == null) return null; @@ -372,7 +367,7 @@ public class ViewModelMessages extends ViewModel { return getPair(plist, ds, count, from + j); } - for (int i = 0; i < count && alive.value; i += CHUNK_SIZE) { + for (int i = 0; i < count && isAlive(); i += CHUNK_SIZE) { Log.i("Observe previous/next load" + " range=" + i + "/#" + count); List messages = ds.loadRange(i, Math.min(CHUNK_SIZE, count - i)); @@ -431,7 +426,7 @@ public class ViewModelMessages extends ViewModel { Log.i("Observe previous/next fallback=" + result); return result; } - }.setOptional(true).execute(context, owner, args, "model:fallback"); + }.execute(context, owner, args, "model:fallback"); } }); } @@ -449,13 +444,16 @@ public class ViewModelMessages extends ViewModel { protected List onExecute(Context context, Bundle args) { List ids = new ArrayList<>(); + if (!isAlive()) + return ids; + PagedList plist = model.list.getValue(); if (plist == null) return ids; LimitOffsetDataSource ds = (LimitOffsetDataSource) plist.getDataSource(); int count = ds.countItems(); - for (int i = 0; i < count; i += 100) + for (int i = 0; i < count && isAlive(); i += 100) for (TupleMessageEx message : ds.loadRange(i, Math.min(100, count - i))) if ((message.uid != null && !message.folderReadOnly) || message.accountProtocol != EntityAccount.TYPE_IMAP)