Кирилл Харьков
TRANSCRIPT
Многозадачность как имплементация Unit Of Work
Кирилл, Харьков
Руководитель Android разработки
Mail.Ru
Обзор
• Проблемы и задачи.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Требования
• Декомпозиция задач
Требования
• Декомпозиция задач• Отделение контекста выполнения задачи от логики
Требования
• Декомпозиция задач• Отделение контекста выполнения задачи от логики• Возможность связывать различные иерархии задач
Требования
• Декомпозиция задач• Отделение контекста выполнения задачи от логики• Возможность связывать различные иерархии задач• Декларативность в объявлении статических параметров типа задач
Типы задач
• Сетевые операции
Типы задач
• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..
Типы задач
• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..
• Операции над моделью
Типы задач
• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..
• Операции над моделью• Аналитика
Типы задач
• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..
• Операции над моделью• Аналитика• Рендеринг
Ограничения
Ограничения
Ограничения
Ограничения
Ограничения
Изменение workflow
Изменение workflow
Изменение workflow
Изменение workflow1. Запрос 1 – ОК2. Запрос 2 – NoAuth3. RefreshAuth - Relogin
Изменение workflow1. Запрос 1 – ОК2. Запрос 2 – NoAuth3. RefreshAuth - ОК4. Запрос 2 - ОК5. Запрос 3 - ОК
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
• 1999. Refactoring: Improving the Design of Existing Code• 2000. Planning Extreme Programming• 2002. Patterns of Enterprise Application Architecture
Команда
Командаpublic abstract class Command<P, V> implements Cancelable {
}
Командаpublic abstract class Command<P, V> implements Cancelable {
private final P mParams;
}
Командаpublic abstract class Command<P, V> implements Cancelable {
private final P mParams;private V mResult;
}
Командаpublic abstract class Command<P, V> implements Cancelable {
private final P mParams;private V mResult;public final V execute() {
if (!isCancelled()) { setResult(onExecute()); onDone(); return mResult; } return null;
}}
Командаpublic abstract class Command<P, V> implements Cancelable {
private final P mParams;private V mResult;public final V execute() {…}
protected abstract V onExecute();
}
Командаpublic abstract class Command<P, V> implements Cancelable {
private final P mParams;private V mResult;public final V execute() {…}
protected abstract V onExecute();
protected void onDone() {}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {
CommandEntry commandEntry = null; while ((commandEntry = getNextCommand()) != null){ onExecuteCommand(commandEntry.getCommand());
} return null;
}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}public void removeCommand(Command<?,?> cmd){…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}public void removeCommand(Command<?,?> cmd){…}public void removeAllCommands(){…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}public void removeCommand(Command<?,?> cmd){…}public void removeAllCommands(){…}public void addCommand(Command<?,?> cmd){…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overrideprotected Object onExecute() {…}
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}public void removeCommand(Command<?,?> cmd){…}public void removeAllCommands(){…}public void addCommand(Command<?,?> cmd){…}public void addCommandAtFront(Command<?,?> cmd){…}
}
Командаpublic abstract class CommandGroup extends Command<Void,Object> {
@Overridepublic void cancel() { synchronized (this) { super.cancel(); if(mCurrentFuture != null) { mCurrentFuture.cancel(true); } if(mCurrentCommand != null){ mCurrentCommand.cancel(); } }}
}
Команда
Команда
Командаclass SimultaneousCommandGroup extends Command<Void, Map<Command<?, ?>, Object>> {
}
Командаclass SimultaneousCommandGroup extends Command<Void, Map<Command<?, ?>, Object>> {
@Overrideprotected Map<Command<?, ?>, Object> onExecute() { final Set<Command<?, ?>> commands = new HashSet<>(); synchronized (this) { commands.addAll(mCommandsResults.keySet()); } for (Command<?, ?> cmd : commands) { onExecuteCommand(cmd); } awaitForCompletion(); return convertToResult();}
}
Команда
public class RemoveAttachment extends PostRequest<Params, EmptyResult> {
}
Команда@LogConfig(logTag = "RemoveAttachmentCmd", logLevel = Level.D)@Authorization(api = "LEGACY", factory = MailAuthorization.MailApiInterfaceFactory.class)@HostProvider(prefKey="attach", defScheme = R.string..scheme, defHost = R.string.host)@UrlPath(pathSegments = {"cgi-bin", "attach_upload2"})public class RemoveAttachment extends PostRequest<Params, EmptyResult> {
}
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Ограничения
• Проблемы и задачи. • Long running operations. Типы задач. Ограничения.• Шаблонные операции, изменение workflow задач.• Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс.• Фоновые задачи и их приоритезация.• Особенности тестирования.
Планировщик задач
Планировщик задач
Планировщик задач@ExecutionPool(pool = ExecutionPool.Pool.NETWORK)
@ExecutionPool(pool = ExecutionPool.Pool.NETWORK)
@ExecutionPool(pool = ExecutionPool.Pool.DATABASE)
Планировщик задач
Планировщик задач
Ограничения
Планировщик задачpublic abstract class CommandGroup extends Command<Void,Object> {
@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){
final Future<T> future = getExecutor().execute(cmd);final T result = getResultFromFuture(future);return result;
}
}
Планировщик задачpublic <T> Future <T> executeSingleCommand(final Command<?, T> cmd) {
}
Планировщик задачpublic <T> Future <T> executeSingleCommand(final Command<?, T> cmd) {
Callable<T> callable = createCallable(cmd);FutureTask<T> newFutureTask = new RemoveFutureTask<>(callable, cmd);Future<T> future = (Future<T>) mCache.putIfAbsent(cmd, newFutureTask);if (future == null) { executeOnPool(newFutureTask, getExecutionPool(cmd)); return newFutureTask;}return future;
}
Планировщик задачpublic <T> Future <T> executeSingleCommand(final Command<?, T> cmd) {
Callable<T> callable = createCallable(cmd);FutureTask<T> newFutureTask = new RemoveFutureTask<>(callable, cmd);Future<T> future = (Future<T>) mCache.putIfAbsent(cmd, newFutureTask);if (future == null) { executeOnPool(newFutureTask, getExecutionPool(cmd)); return newFutureTask;}return future;
}
Командаpublic abstract class Command<P, V> implements Cancelable {
@Overridepublic int hashCode() { int result = this.getClass().hashCode(); result = 31 * result + (mParams != null ? mParams.hashCode() : 0); return result;}
}
Командаpublic abstract class Command<P, V> implements Cancelable {
@Overridepublic boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (mParams != null ? !mParams.equals(((Command) o).getParams()) :
((Command) o).getParams() != null) return false; return true;}
}
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Планировщик задач
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Приоритезация
Приоритезация
Приоритезация
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Обзор
• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.
Question?
Кирилл, Харьков
Руководитель Android разработки
Mail.Ru