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