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

Post on 15-Jun-2015

345 views 2 download

Tags:

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, то если требуется выполнить операцию надо создать сервис, а не просто отдельный поток