* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind * webservice requests). */ public class AppExecutors { private final Executor mDiskIO; private final Executor mNetworkIO; private final Executor mMainThread; private AppExecutors(Executor diskIO, Executor networkIO, Executor mainThread) { this.mDiskIO = diskIO; this.mNetworkIO = networkIO; this.mMainThread = mainThread; } public AppExecutors() { this(Executors.newSingleThreadExecutor(), Executors.newFixedThreadPool(3), new MainThreadExecutor()); } public Executor diskIO() { return mDiskIO; } public Executor networkIO() { return mNetworkIO; } public Executor mainThread() { return mMainThread; } private static class MainThreadExecutor implements Executor { private Handler mainThreadHandler = new Handler(Looper.getMainLooper()); @Override public void execute(@NonNull Runnable command) { mainThreadHandler.post(command); } } }