aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/utils
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-04-30 23:51:01 +0200
committerChristian Schneppe <christian@pix-art.de>2018-04-30 23:51:01 +0200
commitbae77ff8fe587e981caa44ba27f5371b7a6664f6 (patch)
treee96fda7b564e18bc28bf04a5b4debf4c17e01113 /src/main/java/de/pixart/messenger/utils
parentce2ba629bd91897f74e2d1dee38f90671b0f28f8 (diff)
properly cancel pending searchs and scroll to bottom after refresh
Diffstat (limited to 'src/main/java/de/pixart/messenger/utils')
-rw-r--r--src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java7
-rw-r--r--src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java37
2 files changed, 35 insertions, 9 deletions
diff --git a/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java b/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java
index 7bd33eff4..bf4d6e8c2 100644
--- a/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java
+++ b/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java
@@ -18,4 +18,11 @@ public class ReplacingSerialSingleThreadExecutor extends SerialSingleThreadExecu
}
super.execute(r);
}
+
+ public synchronized void cancelRunningTasks() {
+ tasks.clear();
+ if (active != null && active instanceof Cancellable) {
+ ((Cancellable) active).cancel();
+ }
+ }
}
diff --git a/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java b/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java
index 1a1280d5a..500b03c5b 100644
--- a/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java
+++ b/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java
@@ -11,10 +11,10 @@ import de.pixart.messenger.Config;
public class SerialSingleThreadExecutor implements Executor {
+ final ArrayDeque<Runnable> tasks = new ArrayDeque<>();
private final Executor executor = Executors.newSingleThreadExecutor();
- final ArrayDeque<Runnable> tasks = new ArrayDeque<>();
- protected Runnable active;
private final String name;
+ protected Runnable active;
public SerialSingleThreadExecutor(String name) {
this(name, false);
@@ -28,13 +28,7 @@ public class SerialSingleThreadExecutor implements Executor {
}
public synchronized void execute(final Runnable r) {
- tasks.offer(() -> {
- try {
- r.run();
- } finally {
- scheduleNext();
- }
- });
+ tasks.offer(new Runner(r));
if (active == null) {
scheduleNext();
}
@@ -49,4 +43,29 @@ public class SerialSingleThreadExecutor implements Executor {
}
}
}
+
+ private class Runner implements Runnable, Cancellable {
+
+ private final Runnable runnable;
+
+ private Runner(Runnable runnable) {
+ this.runnable = runnable;
+ }
+
+ @Override
+ public void cancel() {
+ if (runnable instanceof Cancellable) {
+ ((Cancellable) runnable).cancel();
+ }
+ }
+
+ @Override
+ public void run() {
+ try {
+ runnable.run();
+ } finally {
+ scheduleNext();
+ }
+ }
+ }
} \ No newline at end of file