Кирилл Харьков

73
Многозадачность как имплементация Unit Of Work Кирилл, Харьков Руководитель Android разработки Mail.Ru

Upload: codefest

Post on 12-Apr-2017

219 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Кирилл Харьков

Многозадачность как имплементация Unit Of Work

Кирилл, Харьков

Руководитель Android разработки

Mail.Ru

Page 2: Кирилл Харьков

Обзор

• Проблемы и задачи.

Page 3: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.

Page 4: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.

Page 5: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 6: Кирилл Харьков

Требования

• Декомпозиция задач

Page 7: Кирилл Харьков

Требования

• Декомпозиция задач• Отделение контекста выполнения задачи от логики

Page 8: Кирилл Харьков

Требования

• Декомпозиция задач• Отделение контекста выполнения задачи от логики• Возможность связывать различные иерархии задач

Page 9: Кирилл Харьков

Требования

• Декомпозиция задач• Отделение контекста выполнения задачи от логики• Возможность связывать различные иерархии задач• Декларативность в объявлении статических параметров типа задач

Page 10: Кирилл Харьков

Типы задач

• Сетевые операции

Page 11: Кирилл Харьков

Типы задач

• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..

Page 12: Кирилл Харьков

Типы задач

• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..

• Операции над моделью

Page 13: Кирилл Харьков

Типы задач

• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..

• Операции над моделью• Аналитика

Page 14: Кирилл Харьков

Типы задач

• Сетевые операции // Retrofit можно припихнуть сюда, потому что модно..

• Операции над моделью• Аналитика• Рендеринг

Page 15: Кирилл Харьков

Ограничения

Page 16: Кирилл Харьков

Ограничения

Page 17: Кирилл Харьков

Ограничения

Page 18: Кирилл Харьков

Ограничения

Page 19: Кирилл Харьков

Ограничения

Page 20: Кирилл Харьков

Изменение workflow

Page 21: Кирилл Харьков

Изменение workflow

Page 22: Кирилл Харьков

Изменение workflow

Page 23: Кирилл Харьков

Изменение workflow1. Запрос 1 – ОК2. Запрос 2 – NoAuth3. RefreshAuth - Relogin

Page 24: Кирилл Харьков

Изменение workflow1. Запрос 1 – ОК2. Запрос 2 – NoAuth3. RefreshAuth - ОК4. Запрос 2 - ОК5. Запрос 3 - ОК

Page 25: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 26: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 27: Кирилл Харьков

• 1999. Refactoring: Improving the Design of Existing Code• 2000. Planning Extreme Programming• 2002. Patterns of Enterprise Application Architecture

Page 28: Кирилл Харьков

Команда

Page 29: Кирилл Харьков

Командаpublic abstract class Command<P, V> implements Cancelable {

}

Page 30: Кирилл Харьков

Командаpublic abstract class Command<P, V> implements Cancelable {

private final P mParams;

}

Page 31: Кирилл Харьков

Командаpublic abstract class Command<P, V> implements Cancelable {

private final P mParams;private V mResult;

}

Page 32: Кирилл Харьков

Команда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;

}}

Page 33: Кирилл Харьков

Командаpublic abstract class Command<P, V> implements Cancelable {

private final P mParams;private V mResult;public final V execute() {…}

protected abstract V onExecute();

}

Page 34: Кирилл Харьков

Команда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() {}

}

Page 35: Кирилл Харьков

Командаpublic abstract class CommandGroup extends Command<Void,Object> {

}

Page 36: Кирилл Харьков

Командаpublic abstract class CommandGroup extends Command<Void,Object> {

@Overrideprotected Object onExecute() {

CommandEntry commandEntry = null; while ((commandEntry = getNextCommand()) != null){ onExecuteCommand(commandEntry.getCommand());

} return null;

}

}

Page 37: Кирилл Харьков

Командаpublic abstract class CommandGroup extends Command<Void,Object> {

@Overrideprotected Object onExecute() {…}

}

Page 38: Кирилл Харьков

Командаpublic abstract class CommandGroup extends Command<Void,Object> {

@Overrideprotected Object onExecute() {…}

@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}

}

Page 39: Кирилл Харьков

Командаpublic abstract class CommandGroup extends Command<Void,Object> {

@Overrideprotected Object onExecute() {…}

@Nullable@CheckForNullprotected <T> T onExecuteCommand(Command<?, T> cmd){…}public void removeCommand(Command<?,?> cmd){…}

}

Page 40: Кирилл Харьков

Команда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(){…}

}

Page 41: Кирилл Харьков

Команда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){…}

}

Page 42: Кирилл Харьков

Команда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){…}

}

Page 43: Кирилл Харьков

Команда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(); } }}

}

Page 44: Кирилл Харьков

Команда

Page 45: Кирилл Харьков

Команда

Page 46: Кирилл Харьков

Командаclass SimultaneousCommandGroup extends Command<Void, Map<Command<?, ?>, Object>> {

}

Page 47: Кирилл Харьков

Команда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();}

}

Page 48: Кирилл Харьков

Команда

public class RemoveAttachment extends PostRequest<Params, EmptyResult> {

}

Page 49: Кирилл Харьков

Команда@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> {

}

Page 50: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 51: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 52: Кирилл Харьков

Ограничения

• Проблемы и задачи. • Long running operations. Типы задач. Ограничения.• Шаблонные операции, изменение workflow задач.• Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс.• Фоновые задачи и их приоритезация.• Особенности тестирования.

Page 53: Кирилл Харьков

Планировщик задач

Page 54: Кирилл Харьков

Планировщик задач

Page 55: Кирилл Харьков

Планировщик задач@ExecutionPool(pool = ExecutionPool.Pool.NETWORK)

@ExecutionPool(pool = ExecutionPool.Pool.NETWORK)

@ExecutionPool(pool = ExecutionPool.Pool.DATABASE)

Page 56: Кирилл Харьков

Планировщик задач

Page 57: Кирилл Харьков

Планировщик задач

Page 58: Кирилл Харьков

Ограничения

Page 59: Кирилл Харьков

Планировщик задач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;

}

}

Page 60: Кирилл Харьков

Планировщик задачpublic <T> Future <T> executeSingleCommand(final Command<?, T> cmd) {

}

Page 61: Кирилл Харьков

Планировщик задач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;

}

Page 62: Кирилл Харьков

Планировщик задач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;

}

Page 63: Кирилл Харьков

Команда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;}

}

Page 64: Кирилл Харьков

Команда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;}

}

Page 65: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 66: Кирилл Харьков

Планировщик задач

Page 67: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 68: Кирилл Харьков

Приоритезация

Page 69: Кирилл Харьков

Приоритезация

Page 70: Кирилл Харьков

Приоритезация

Page 71: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 72: Кирилл Харьков

Обзор

• Проблемы и задачи. • Команды, компановщики, варианты исполнения.• Планировщик задач, кэширование, прогресс, приоритезация.• Особенности тестирования.

Page 73: Кирилл Харьков

@twitter

Question?

facebook

[email protected]

Кирилл, Харьков

Руководитель Android разработки

Mail.Ru