1package eu.siacs.conversations.utils;
2
3import android.os.Looper;
4
5import java.util.ArrayDeque;
6import java.util.Queue;
7import java.util.concurrent.Executor;
8import java.util.concurrent.Executors;
9
10public class SerialSingleThreadExecutor implements Executor {
11
12 final Executor executor = Executors.newSingleThreadExecutor();
13 protected final Queue<Runnable> tasks = new ArrayDeque();
14 Runnable active;
15
16 public SerialSingleThreadExecutor() {
17 this(false);
18 }
19
20 public SerialSingleThreadExecutor(boolean prepareLooper) {
21 if (prepareLooper) {
22 execute(new Runnable() {
23 @Override
24 public void run() {
25 Looper.prepare();
26 }
27 });
28 }
29 }
30
31 public synchronized void execute(final Runnable r) {
32 tasks.offer(new Runnable() {
33 public void run() {
34 try {
35 r.run();
36 } finally {
37 scheduleNext();
38 }
39 }
40 });
41 if (active == null) {
42 scheduleNext();
43 }
44 }
45
46 protected synchronized void scheduleNext() {
47 if ((active = tasks.poll()) != null) {
48 executor.execute(active);
49 }
50 }
51}