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

Post on 12-Apr-2017

205 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

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;}

}

Обзор

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

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

Обзор

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

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

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

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

Обзор

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

Обзор

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

@twitter

Question?

facebook

www.info@mail.ru

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

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

Mail.Ru

top related