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

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

Apr 12, 2017

Download

Software

CodeFest
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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