Android осень 2013 лекция 3
-
Upload
technopark -
Category
Education
-
view
345 -
download
2
Transcript of Android осень 2013 лекция 3
Лекция №3 «Android Multithreading»
Предыдущая лекция
Что такое фрагмент?
Зачем они нужны?
Как можно создать?
Что такое транзакция(в терминах фрагментов)?
Когда нельзя вызывать commit()?
Чем RelativeLayout лучше чем LinearLayout?
Что такое StateListDrawable?
Как так получилось что xml тоже drawable?
2
Потоки в Java
3
Thread
Runnable
Callable
Executors
Join, sleep, wait, notify
Потоки в Android
Длительные операции в UI Thread останавливают всю отрисовку и игнорируют пользователя
CalledFromWrongThreadException
Loopers & Handlers
Activity.runOnUiThread()
AsyncTasks
IntentService
4
Looper
Присоединяет MessageQueue к потоку
Управляется очередью
Handler отправляет в очередь сообщения
ThreadLocal
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
5
Looper Life Cycle
6
Looper Life Cycle
7
Looper Life Cycle
8
Looper create
9
Handler
Постит Runnables в Looper
Привязан к потоку
Сам может быть обработчиком сообщения, которое послал
Отложенное по времени выполение кода
Выполнение кода не в своем потоке
10
AsyncTask
11
AsyncTask<Params, Progress, Result>
Убирает весь поточный зоопарк
Основная задача – выполнить задачу в background и запостить результат в UI thread
Без намека на Thread, Looper, Handler и проч.
Три метода:
doInBackground(Params… p){return Result
onProgressUpdate(Progress… pr)
onPostExecute(Result)
new AsyncTaskExample().execute(Params)
12
Важные замечания по AsyncTask
Нельзя запустить один и тот же AsyncTask больше одного раза
Вызов cancel не остановит выполнение doInBackground – вместо onPostExecute будет вызван onCancelled
Все AsyncTasks в приложении запускаются в одном потоке подряд(с Honeycomb), если нужно другое поведение – executeOnExecutor()
get() – блокирует поток и возвращает Result
13
Processes
I уровень – foreground process
Activity, с которой взаимодействует пользователь
Сервис, который привязан к activity, с которой взаимодействуют
Сервис, запущенный с помощью startForeground()
Сервис в котором выполняется один из life cycle callbacks
Ресивер, в котором выполняется onReceive()
II Уровень – visible process
Activity после onPause()
Сервис привязанный к такой активити
III Уровень – service process
Сервис, запущенный с помощью startService() и не относящийся к предыдущим уровням
IV Уровень – Background process
Процесс с activity, которая не видна пользователю
V Уровень – Empty process
Для кеша
14
Processes
15
Android ставит насколько можно высокий приоритет
Практическое применение: т.к. Процесс с сервисом приоритетнее чем с background activity, то если требуется выполнить операцию надо создать сервис, а не просто отдельный поток