SlideShare a Scribd company logo
1 of 23
Download to read offline
Droidcon Moscow 2015
Взаимодействие между
потоками в Android
Максим Ефимов
Кто я такой
0
- Android team lead @ Redmadrobot
- Делал «Мой Билайн», «Открытие»,
«Альфастрахование»
- Всего выпустил больше 30 Android приложений
- Заморачиваюсь по архитектуре
- Модель потоков в Android
- Какие сложности таит жизненный цикл
- Чем плохи стандартные решения
- Хорошие решения
О чём будем говорить
1
Модель потоков в Android
2
- Main поток - обрабатывает циклы GUI
- Looper - обеспечивает очередь сообщений внутри потока
- Handler - умеет писать и читать сообщения из очереди Looper’а
- Остальные потоки - по умолчанию не имею цикла, делают
«долгие операции»
Примеры долгих операций
3
- Сетевое взаимодействие
- Обращения к базе данных
- Чтение дискового каша
- Преобразование изображений
Жизненный цикл I - Связь с background
4
onCreate onStart onResume onPause
starLoading endLoading
Main thread
Background thread
onClick
Main thread
looper
Жизненный цикл II - В идеальном мире
5
onResume onPause
starLoading endLoading
Main thread
Background thread
onClick
Main thread
looper
Loop showData
Жизненный цикл III - Повернули экран
6
onResume onDestroy
starLoading endLoading
Main thread - первый Activity Instance
Background thread
onClick
Main thread
looper
showData
onResume Loop showData
Main thread - второй Activity Instance
Жизненный цикл IV - Свернули приложение
7
onResume onDestroy
starLoading endLoading
Main thread - первый Activity Instance
Background thread
onClick
Main thread
looper
showData
onResume Loop showData
Main thread - второй Activity
Жизненный цикл - сложности
8
- Поток может вернуть результат в
уничтоженный объект
- Поток может потерять результат
- Необходимо где-то кешировать результаты
- Нужно, чтобы кеширование было удобным
Решения – Thread
9
Button signInButton = (Button) findViewById(R.id.button_auth);

signInButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

final Activity activity = AuthActivity.this;

showProgress();

new Thread(new Runnable() {

@Override

public void run() {

APIFactory.getApi().signIn();

activity.runOnUiThread(new Runnable() {

@Override

public void run() {

goToMainContent();

}

});

}

}).start();



}

});
- Течет память
- Возврат в
уничтоженный
объект
- Необходимо
руками писать в
основной поток
Решения – AsyncTask
10
private class AuthTask extends AsyncTask<Void, Void, Boolean> {



@Override

protected void onPreExecute() {

showProgress();

}



@Override

protected Boolean doInBackground(final Void... params) {

try {

APIFactory.getApi().signIn();

}catch (Exception e){

return false;

}

return true;

}



@Override

protected void onPostExecute(final Boolean result) {

if(!isCancelled() && result) {

goToMainContent();

}

}

}
Button signInButton = (Button) findViewById(R.id.button_auth);

signInButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

new AuthTask().execute();

}

});
- Течет память
- Возврат в уничтоженный объект
Решения – Loader
11
Кода не будет
Пример из документации: 154 строки
Решения – Callback
12
Button signInButton = (Button) findViewById(R.id.button_auth);

signInButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

new AuthRequest(new Callback<Result>(){



@Override

public void handleMessage(final Result result) {

showData();

}



@Override

public void handleError(final Exception exception) {

showError(exception);

}

}).run();

}

});
- Retrofit
- Volley
- RxJava
На самом деле не решают
поставленных проблем
Проблемы решений
13
- Нет привязки к жизненному циклу
- Утечки памяти
- Потеря данных
- Сложная реализация
Хорошие решения – Robospice
14
- Следит за жизненным циклом
- Заточена под сеть
- Есть свой кэш
- Память не течет
- Имеет 100500 плагинов
Хорошие решения – Chronos
15
- Следит за жизненным циклом
- Подхватывает запущенные задачи
- Минималистичен
Chronos - запуск операции
16
class MyActivity extends ChronosActivity {



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);



Button startButton = (Button) findViewById(R.id.button_start);

startButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

runOperation(new MyOperation());

}

});

}

}
Chronos - операция
17
class MyOperation extends ChronosOperation<BusinessObject> {



@Nullable

@Override

public BusinessObject run() {

final BusinessObject result ;

// here you should write what you do to get the BusinessObject

return result;

}



@NonNull

@Override

public Class<? extends ChronosOperationResult<BusinessObject>> getResultClass(){

return Result.class;

}



public final static class Result extends ChronosOperationResult<BusinessObject> {

}

}
Chronos - обработка результата
18
class MyActivity extends ChronosActivity {



public void onOperationFinished(final MyOperation.Result result) {

if (result.isSuccessful()) {

showData(result.getOutput());

} else {

showDataLoadError(result.getError());

}

}



private void showData(BusinessObject data){

//...

}



private void showDataLoadError(Exception exception){

//...

}

}
Chronos - трекинг запусков
19
class MyActivity extends ChronosActivity {



private Data mData;



@Override

protected void onResume() {

super.onResume();

if (mData == null) {

runOperation(new LoadData(), "load_data");

} else {

showData(mData);

}

}



public void onOperationFinished(final LoadData.Result result) {

if (result.isSuccessful()) {

showData(result.getOutput());

} else {

showDataLoadError(result.getError());

}

}

}
Chronos - что еще?
20
- Отмена операций
- Синхронный запуск
- Bradcast результатов
- Opensource
Спасибо за внимание!
21
Вопросы?
me@redmadrobot.ru

More Related Content

What's hot

Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14Andrew Shitov
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...sqadays8
 
Razrabotka testovykh primerov_ts
Razrabotka testovykh primerov_tsRazrabotka testovykh primerov_ts
Razrabotka testovykh primerov_tsNickola14
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовPyNSK
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 

What's hot (20)

Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Python infrastructure from scratch
Python infrastructure from scratchPython infrastructure from scratch
Python infrastructure from scratch
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14
 
Funny JS #1
Funny JS #1Funny JS #1
Funny JS #1
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
6828
68286828
6828
 
Collider
ColliderCollider
Collider
 
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
 
Razrabotka testovykh primerov_ts
Razrabotka testovykh primerov_tsRazrabotka testovykh primerov_ts
Razrabotka testovykh primerov_ts
 
PHP basic
PHP basicPHP basic
PHP basic
 
Selenium vs AJAX
Selenium vs AJAXSelenium vs AJAX
Selenium vs AJAX
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 

Similar to Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов - Redmadrobot

Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TKConf
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяYuri Shmakov
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ontico
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOMRoman Dvornov
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
Как стать продуктивным Android разработчиком
Как стать продуктивным Android разработчикомКак стать продуктивным Android разработчиком
Как стать продуктивным Android разработчикомPavel Shchahelski
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 

Similar to Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов - Redmadrobot (20)

Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоваться
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Как стать продуктивным Android разработчиком
Как стать продуктивным Android разработчикомКак стать продуктивным Android разработчиком
Как стать продуктивным Android разработчиком
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Droidcon Moscow 2015. Взаимодействие между потоками в Android. Максим Ефимов - Redmadrobot

  • 1. Droidcon Moscow 2015 Взаимодействие между потоками в Android Максим Ефимов
  • 2. Кто я такой 0 - Android team lead @ Redmadrobot - Делал «Мой Билайн», «Открытие», «Альфастрахование» - Всего выпустил больше 30 Android приложений - Заморачиваюсь по архитектуре
  • 3. - Модель потоков в Android - Какие сложности таит жизненный цикл - Чем плохи стандартные решения - Хорошие решения О чём будем говорить 1
  • 4. Модель потоков в Android 2 - Main поток - обрабатывает циклы GUI - Looper - обеспечивает очередь сообщений внутри потока - Handler - умеет писать и читать сообщения из очереди Looper’а - Остальные потоки - по умолчанию не имею цикла, делают «долгие операции»
  • 5. Примеры долгих операций 3 - Сетевое взаимодействие - Обращения к базе данных - Чтение дискового каша - Преобразование изображений
  • 6. Жизненный цикл I - Связь с background 4 onCreate onStart onResume onPause starLoading endLoading Main thread Background thread onClick Main thread looper
  • 7. Жизненный цикл II - В идеальном мире 5 onResume onPause starLoading endLoading Main thread Background thread onClick Main thread looper Loop showData
  • 8. Жизненный цикл III - Повернули экран 6 onResume onDestroy starLoading endLoading Main thread - первый Activity Instance Background thread onClick Main thread looper showData onResume Loop showData Main thread - второй Activity Instance
  • 9. Жизненный цикл IV - Свернули приложение 7 onResume onDestroy starLoading endLoading Main thread - первый Activity Instance Background thread onClick Main thread looper showData onResume Loop showData Main thread - второй Activity
  • 10. Жизненный цикл - сложности 8 - Поток может вернуть результат в уничтоженный объект - Поток может потерять результат - Необходимо где-то кешировать результаты - Нужно, чтобы кеширование было удобным
  • 11. Решения – Thread 9 Button signInButton = (Button) findViewById(R.id.button_auth);
 signInButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(final View v) {
 final Activity activity = AuthActivity.this;
 showProgress();
 new Thread(new Runnable() {
 @Override
 public void run() {
 APIFactory.getApi().signIn();
 activity.runOnUiThread(new Runnable() {
 @Override
 public void run() {
 goToMainContent();
 }
 });
 }
 }).start();
 
 }
 }); - Течет память - Возврат в уничтоженный объект - Необходимо руками писать в основной поток
  • 12. Решения – AsyncTask 10 private class AuthTask extends AsyncTask<Void, Void, Boolean> {
 
 @Override
 protected void onPreExecute() {
 showProgress();
 }
 
 @Override
 protected Boolean doInBackground(final Void... params) {
 try {
 APIFactory.getApi().signIn();
 }catch (Exception e){
 return false;
 }
 return true;
 }
 
 @Override
 protected void onPostExecute(final Boolean result) {
 if(!isCancelled() && result) {
 goToMainContent();
 }
 }
 } Button signInButton = (Button) findViewById(R.id.button_auth);
 signInButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(final View v) {
 new AuthTask().execute();
 }
 }); - Течет память - Возврат в уничтоженный объект
  • 13. Решения – Loader 11 Кода не будет Пример из документации: 154 строки
  • 14. Решения – Callback 12 Button signInButton = (Button) findViewById(R.id.button_auth);
 signInButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(final View v) {
 new AuthRequest(new Callback<Result>(){
 
 @Override
 public void handleMessage(final Result result) {
 showData();
 }
 
 @Override
 public void handleError(final Exception exception) {
 showError(exception);
 }
 }).run();
 }
 }); - Retrofit - Volley - RxJava На самом деле не решают поставленных проблем
  • 15. Проблемы решений 13 - Нет привязки к жизненному циклу - Утечки памяти - Потеря данных - Сложная реализация
  • 16. Хорошие решения – Robospice 14 - Следит за жизненным циклом - Заточена под сеть - Есть свой кэш - Память не течет - Имеет 100500 плагинов
  • 17. Хорошие решения – Chronos 15 - Следит за жизненным циклом - Подхватывает запущенные задачи - Минималистичен
  • 18. Chronos - запуск операции 16 class MyActivity extends ChronosActivity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 Button startButton = (Button) findViewById(R.id.button_start);
 startButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(final View v) {
 runOperation(new MyOperation());
 }
 });
 }
 }
  • 19. Chronos - операция 17 class MyOperation extends ChronosOperation<BusinessObject> {
 
 @Nullable
 @Override
 public BusinessObject run() {
 final BusinessObject result ;
 // here you should write what you do to get the BusinessObject
 return result;
 }
 
 @NonNull
 @Override
 public Class<? extends ChronosOperationResult<BusinessObject>> getResultClass(){
 return Result.class;
 }
 
 public final static class Result extends ChronosOperationResult<BusinessObject> {
 }
 }
  • 20. Chronos - обработка результата 18 class MyActivity extends ChronosActivity {
 
 public void onOperationFinished(final MyOperation.Result result) {
 if (result.isSuccessful()) {
 showData(result.getOutput());
 } else {
 showDataLoadError(result.getError());
 }
 }
 
 private void showData(BusinessObject data){
 //...
 }
 
 private void showDataLoadError(Exception exception){
 //...
 }
 }
  • 21. Chronos - трекинг запусков 19 class MyActivity extends ChronosActivity {
 
 private Data mData;
 
 @Override
 protected void onResume() {
 super.onResume();
 if (mData == null) {
 runOperation(new LoadData(), "load_data");
 } else {
 showData(mData);
 }
 }
 
 public void onOperationFinished(final LoadData.Result result) {
 if (result.isSuccessful()) {
 showData(result.getOutput());
 } else {
 showDataLoadError(result.getError());
 }
 }
 }
  • 22. Chronos - что еще? 20 - Отмена операций - Синхронный запуск - Bradcast результатов - Opensource