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();
}
});
- Течет память
- Возврат в
уничтоженный
объект
- Необходимо
руками писать в
основной поток
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> {
}
}