Android осень 2013 лекция 3

15
Лекция 3 «Android Multithreading»

Transcript of Android осень 2013 лекция 3

Page 1: Android осень 2013 лекция 3

Лекция №3 «Android Multithreading»

Page 2: Android осень 2013 лекция 3

Предыдущая лекция

Что такое фрагмент?

Зачем они нужны?

Как можно создать?

Что такое транзакция(в терминах фрагментов)?

Когда нельзя вызывать commit()?

Чем RelativeLayout лучше чем LinearLayout?

Что такое StateListDrawable?

Как так получилось что xml тоже drawable?

2

Page 3: Android осень 2013 лекция 3

Потоки в Java

3

Thread

Runnable

Callable

Executors

Join, sleep, wait, notify

Page 4: Android осень 2013 лекция 3

Потоки в Android

Длительные операции в UI Thread останавливают всю отрисовку и игнорируют пользователя

CalledFromWrongThreadException

Loopers & Handlers

Activity.runOnUiThread()

AsyncTasks

IntentService

4

Page 5: Android осень 2013 лекция 3

Looper

Присоединяет MessageQueue к потоку

Управляется очередью

Handler отправляет в очередь сообщения

ThreadLocal

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

5

Page 6: Android осень 2013 лекция 3

Looper Life Cycle

6

Page 7: Android осень 2013 лекция 3

Looper Life Cycle

7

Page 8: Android осень 2013 лекция 3

Looper Life Cycle

8

Page 9: Android осень 2013 лекция 3

Looper create

9

Page 10: Android осень 2013 лекция 3

Handler

Постит Runnables в Looper

Привязан к потоку

Сам может быть обработчиком сообщения, которое послал

Отложенное по времени выполение кода

Выполнение кода не в своем потоке

10

Page 11: Android осень 2013 лекция 3

AsyncTask

11

Page 12: Android осень 2013 лекция 3

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

Page 13: Android осень 2013 лекция 3

Важные замечания по AsyncTask

Нельзя запустить один и тот же AsyncTask больше одного раза

Вызов cancel не остановит выполнение doInBackground – вместо onPostExecute будет вызван onCancelled

Все AsyncTasks в приложении запускаются в одном потоке подряд(с Honeycomb), если нужно другое поведение – executeOnExecutor()

get() – блокирует поток и возвращает Result

13

Page 14: Android осень 2013 лекция 3

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

Page 15: Android осень 2013 лекция 3

Processes

15

Android ставит насколько можно высокий приоритет

Практическое применение: т.к. Процесс с сервисом приоритетнее чем с background activity, то если требуется выполнить операцию надо создать сервис, а не просто отдельный поток