SerialSingleThreadExecutor.java

 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}