- Ёранссон Андерс — Эффективное использование потоков в операционной системе Android. Технологии асинхронной обработки данных
- Описание:
- Несколько книг для начинающего и продолжающего разработчика под Android
- Книги для продвинутых Android-разработчиков
- 1. Android Programming: The Big Nerd Ranch Guide — Bill Phillips, Chris Stewart & Kristin Marsicano
- 2. The Busy Coder’s Guide to Android Development — Mark L. Murphy
- 3. Efficient Android Threading: Asynchronous Processing Techniques for Android Applications — Anders Goransson
- 4. Android Cookbook — Darwin Ian
- 5. Professional Android (4th edition) — Meier R., Lake I.
- Эффективное использование потоков в операционной системе Android
- Аннотация
- Многопоточная разработка для Android, часть 1
- Содержание статьи
- Процессы и потоки
- Xakep #208. Атака на сигналку
- Потоки в Android
- Thread и Runnable
- Looper
- AsynkTask
- Сложность с отменой
- Потеря результатов
- Утечка памяти
- Что же делать?
- WeakReference
- Loaders
- To be continued
Ёранссон Андерс — Эффективное использование потоков в операционной системе Android. Технологии асинхронной обработки данных
Описание:
Эффективное использование потоков в операционной системе Android. Технологии асинхронной обработки данных
Год издания: 2015
Автор: Ёранссон Андерс
Переводчик: Снастин А.В.
Жанр или тематика: Android
Издательство: ДМК Пресс
Язык: Русский
Формат: PDF
Качество: Отсканированные страницы
Количество страниц: 304
Описание: При написании действительно полезного и удобного приложения для Android без многопоточности никак не обойтись, но как узнать о технологиях и методиках, которые помогут решить такую задачу? Эта книга с практической точки зрения описывает несколько асинхронных механизмов, доступных в программной среде Android SDK, а также рассматривает основные принципы и правила выбора одного из них, лучше всего подходящего для создаваемого приложения. Автор раскрывает все достоинства и недостатки каждой технологии, сопровождая теорию примерами программного кода, и подробно объясняет наиболее рациональные способы их применения. В первой части книги рассматриваются основополагающие компоненты, отвечающие за асинхронную обработку. Во второй части главное внимание уделено библиотекам и программным конструкциям ОС Android, используемым для разработки быстрых, эффективных и правильно структурированных приложений.
Несколько книг для начинающего и продолжающего разработчика под Android
В прошлом году я входил в миры Android. Помимо изучения исходников, документации, статей, блогов, аудио- и видео-материалов по теме, читал книги. Спешу поделиться читательским опытом.
Под катом небольшой обзор восьми книг. Темы следующие:
Reactive Programming with RxJava: Creating Asynchronous, Event-Based Applications. By Tomasz Nurkiewicz, Ben Christensen. O’Reilly Media; 1 edition October 27, 2016; 372 pages;
ISBN-13: 978-1491931653
Книга, которая на примере RxJava поможет понять вам, что такое реактивное программирование. Она требует от вас неплохое знание Java (по крайней мере, вы должны понимать, что такое обобщенные типы и лямбда-выражения) и предполагает последовательное чтение, т.к. материал подается шаг за шагом. Мне кажется, в этой связности и последовательности подачи материала — основная прелесть книги. Внимательный читатель получит полное представление о RxJava. В этом главный профит издания.
Но, даже если уверены в своих знаниях Rx, книга наверняка откроет вам что-то новое. Тем более, если вы только начинаете изучать тему. Если это так, то можно дать вам еще один совет: закрепляйте на практике пройденные темы и изучайте open-source проекты. Так вы быстрее освоите Rx.
Недостатком книги можно считать тот факт, что она имеет в виду версию RxJava 1.1.6. Во второй версии RxJava претерпела некоторые существенные изменения (см. статьи на Хабре Исследуем RxJava 2 для Android и ReactiveX 2.0 с примерами, а также полный список изменений на wiki проекта What’s different in 2.0), и поэтому некоторые места в книге устарели. Однако эти изменения вытекали из общей логики развития RxJava и в книге о них идет речь. Думаю, второе издание должно поставить все на свои места, хотя к этому моменту, возможно, появиться RxJava 3.
Еще один небольшой недостаток, на мой взгляд: книга недостаточно развернуто объясняет теорию реактивного программирования и начинающему разработчику может быть нелегко войти в тему. Хорошее место для этой цели первая глава, но она (с учетом отличий от RxJava 2) выглядит запутанной.
Непосредственно работе RxJava в Android посвящена восьмая глава. Много прекрасно разобранных практических примеров. Но опять же, на сегодня охват возможностей Rx в Android неполон.
В целом, ни один из недостатков не перечеркивает достоинств книги. Она может быть рекомендована к чтению как начинающими разработчиками, так и опытными девелоперами.
Кроме прочего, всегда интересно посмотреть, каких на этот раз животных поместило на обложку издательство O’Reilly.
Есть перевод на русский:
Нуркевич Т., Кристенсен Б. Реактивное программирование с применением RxJava. Разработка асинхронных событийно-ориентированных приложений. ДМК Пресс, 2017 год, 358 стр.
ISBN: 978-5-97060-496-0
То, что есть недостатки, можно отнести скорее к лаконичному стилю изложения (книга обложка перевода
Android Programming: The Big Nerd Ranch Guide. By Bill Phillips, Chris Stewart & Kristin Marsicano. Big Nerd Ranch Guides; 3 edition February 9, 2017; 624 pages;
ISBN-13: 978-0134706054 Действительно неплохая книга, которую можно смело рекомендовать начинающим разработчикам или преподавателям, для составления программы обучения Android-разработке. Если вы начинающий разработчик, то в книге вы найдете множество приемов и примеров для программирования Android-приложений, к которым вы бы могли идти самостоятельно довольно долго. Книга начинает с «Hello world» и через теорию, упражнения и написание небольших приложений, обучает основному стеку технологий для создания Android-приложения. Требует среднего знания Java.
Из минусов я бы назвал неравномерную сложность, довольно большой объем. Думаю, если вы начнете проходить книгу от корки до корки, то для этого вам понадобится много терпения. Не факт, что такой способ не замедлит ваше развитие, как разработчика. Я бы рекомендовал использовать этот фолиант скорее как справочник по интересующей вас теме (теорию быстрее узнать, например, на каком-либо онлайн-курсе), а для скорейшего вхождения в тему Android-разработки — писать свои проекты и изучать, как пишут код другие разработчики.
Есть перевод на русский:
Филлипс Б., Стюарт К., Марсикано К.Android. Программирование для профессионалов. 3-е издание / пер. с англ. — СПб.: Издательский дом «Питер», 2017 год, 688 стр.
ISBN: 978-5-4461-0413-0
Kotlin in Action. By Dmitry Jemerov & Svetlana Isakova. Manning Publications; 1 edition February 19, 2017; 360 pages;
ISBN-13: 978-1617293290 «Kotlin в действии» — книга от создателей языка. Книга очень хорошо написана. Я имею в виду структуру материала, стиль повествования и оформление текста. Сложилось впечатление, что авторы взяли все лучшее из книг о языках программирования и воплотили это в своей работе. Главная их заслуга в том, что они сумели отойти от формализма документации и смогли показать особенности языка и историю его развития так, что мы получили своего рода «рассказ», связанное повествование, за развитием «сюжета» которого следишь с интересом.
Книга удачно разделена на главы, параграфы и разделы. Материал организован от простого к сложному. Книга предполагает, что читатель знает Java на достаточном уровне, поскольку язык Kotlin во многом опирается на Java. Если вы Android-разработчик, который пишет, или которому предстоит писать на Kotlin, тогда эта книга для вас. Но если вы начинающий девелопер и недостаточно сильны в Java, вы также можете читать эту книгу. Вам просто придется чуть больше поработать над ней. Даже теория (например, теория лямбда-выражений или обобщенных типов) объяснена в книге очень хорошо. И это здорово поможет войти в тему, если вы делаете первые шаги в программировании.
Книга имеет в виду Kotlin 1.0, поэтому, например, в ней отсутствует описание корутин (coroutine).
Книга не привязана к конкретной предметной области (например, Kotlin в Android), и может использоваться как отличное введение для всех, кто изучает Kotlin.
Есть перевод на русский:
Исакова С., Жемеров Д. Kotlin в действии / пер. с англ. Киселев А.Н. — М.: ДМК-Пресс, октябрь 2017 г., 402 стр.
ISBN: 978-5-97060-497-7
Kotlin for Android Developers: Learn Kotlin the easy way while developing an Android App By Antonio Leiva. CreateSpace Independent Publishing Platform; 1 edition March 21, 2016; 212 pages;
ISBN-13: 978-1530075614 Это была первая книга, которая вышла о языке Kotlin. По сравнению с книгой «Kotlin in action» она проигрывает как введение в язык, но вместе с тем может служить примером использования языка в Android. В книге разрабатываются приложения, исходники которых лежат на GitHub.
Минусы: материал в книге довольно запутан, автор часто ссылается на репозиторий в GitHub, но при этом не всегда можно понять какую ветку он имеет в виду. Впечатление, что написанное в книге, лучше подходит для формата блога или серии статей о разработке приложения на Kotlin.
В книге можно найти пару-тройку интересных приемов программирования на Kotlin под Android.
Android Development with Kotlin By Marcin Moskala & Igor Wojda. Packt Publishing — ebooks Account, September 6, 2017; 440 pages;
ISBN-13: 978-1787123687 Книга по-сути является рассказом о языке Kotlin. Хотя и всегда имеет в виду разработку под Android. Но непосредственно создание небольшого приложения, происходит только в последней главе. Мне представляется, что в плане введения в язык эта книга проигрывает книге «Kotlin in action».
Главный минус, что эта книга никак не является введением в Android-разработку на Kotlin, так что название может путать читателя. Англоязычные читатели жалуются на плохой английский, но я не заметил, конечно.
Саму книгу не дочитал (книги «Kotlin in action» вполне хватает для введения в язык), поэтому не могу судить о ней с полной уверенностью.
В электронной версии книгу очень удобно читать на сайте издательства с помощью специальной читалки Mapt.
У одного из авторов есть занятные статьи: например, о кроссплатформенности на Kotlin.
Mastering Android Development with Kotlin: Deep dive into the world of Android to create robust applications with Kotlin By Milos Vasic. Packt Publishing — ebooks Account, November 8, 2017; 378 pages;
ISBN-13: 978-1788473699 Эту книгу можно считать полноценным введением в разработку под Android. Она начинает с установки Android Studio, проходит по многим аспектам Android, и заканчивает объяснением публикации приложения на Google Play. В этом смысле книга — некий аналог книге «Android Programming: The Big Nerd Ranch Guide», только на Kotlin. Поэтому книга может быть рекомендована начинающим разработчикам, которые решили освоить разработку под Android через Kotlin. Книга предполагает базовое знакомство с Kotlin.
Мне кажется, что книга не слишком глубоко говорит о разработке на Android, но объясняет нужные вещи. Например, работу с Git или использование библиотеки Retrofit. Что касается использования языка Kotlin для обучения разработке под Android, то сам автор предупреждает, что Kotlin лишь дополнительный инструмент для Android, и Java, как и С++ (для Native), еще никто не отменял.
Как я уже говорил, электронные книги данного издательства удобно читать, благодаря встроенной читалке Mapt.
Reactive Programming in Kotlin: Design and build non-blocking, asynchronous Kotlin applications with RXKotlin, Reactor-Kotlin, Android, and Spring By Rivu Chakraborty. Packt Publishing — ebooks Account, December 5, 2017; 322 pages;
ISBN-13: 978-1788473026 Эта книга появилась недавно, так что я не успел достаточно хорошо с ней познакомиться. Но, что сразу бросается в глаза — она начинается с пространного введения, объясняющего концепцию реактивного программирования, и, затем, плавно переходит на Rx (в данном случае, RxKotlin). Книга имеет в виду вторую версию Rx, что выгодно отличает ее (как и более полное введение) от первой книги («Reactive Programming with RxJava») в этом обзоре. Хотя само объяснение сущностей Rx, операторов, концепции backpressure и т.д. дается в гораздо более лаконичной форме. Этот факт, не позволяет считать данную книгу полноценной заменой первой.
Об RxKotlin в Android идет речь в последней главе. Читатель знакомится с возможностями RxKotlin в Android на примере небольшого приложения, в котором, кроме прочего, используется Retrofit вместе с адаптером от Джейка Вортона.
Книга хорошо оформлена и разбита на главы и разделы, читается быстро. Может быть рекомендована, в дополнение к первой книге об Rx в этом обзоре, особенно для девелоперов изучающих Kotlin. Предполагает знакомство с Kotlin на базовом уровне.
Остальные книги о Kotlin см. на этой странице оф. сайта языка и на сайте издательства Packt Publishing.
Книги для продвинутых Android-разработчиков
Разница между junior- и senior-разработчиками в том, что первый может реализовать какую-то фичу, а второй может объяснить, что скрывается за каждой строкой кода, найти потенциально проблемные места и оптимизировать их. Следующие книги позволят вам получить знания, которые повысят ваш уровень как разработчика. Есть литература и для среднего, и для профессионального уровня.
1. Android Programming: The Big Nerd Ranch Guide — Bill Phillips, Chris Stewart & Kristin Marsicano
Хотя эта книга часто рекомендуется для начинающих, она имеет неравномерную сложность и довольно большой объём, поэтому вам придётся по ходу её изучения заглядывать и в другие источники. Но это прекрасный выбор для тех, чей уровень ближе к среднему, и кто хочет улучшить свои навыки. К тому же, в дополнение к теории книга содержит множество примеров по созданию различных приложений.
Книга действительно неплоха, поэтому её можно рекомендовать даже преподавателям для составления программы обучения Android-разработке. Требует среднего знания Java.
На русском книга вышла под названием «Android. Программирование для профессионалов», Филлипс Б., Стюарт К., Марсикано К.
2. The Busy Coder’s Guide to Android Development — Mark L. Murphy
Не что иное, как руководство по Android-разработке для занятого программиста. А кто-нибудь видел незанятого программиста?
Книга содержит более 200 глав и рассказывает о переводе приложений на передовые методы разработки. Пожалуй, разработчики среднего уровня не разочаруются.
3. Efficient Android Threading: Asynchronous Processing Techniques for Android Applications — Anders Goransson
При написании действительно полезного и удобного приложения для Android без многопоточности никак не обойтись, но как узнать о технологиях и методиках, которые помогут решить такую задачу? Эта книга с практической точки зрения описывает несколько асинхронных механизмов, доступных в программной среде Android SDK, а также рассматривает основные принципы и правила выбора одного из них, лучше всего подходящего для создаваемого приложения.
Автор раскрывает все достоинства и недостатки каждой технологии, сопровождая теорию примерами программного кода, и подробно объясняет наиболее рациональные способы их применения. В первой части книги рассматриваются основополагающие компоненты, отвечающие за асинхронную обработку. Во второй части главное внимание уделено библиотекам и программным конструкциям ОС Android, используемым для разработки быстрых, эффективных и правильно структурированных приложений.
Из недостатков: — не очень подробное разъяснение взаимодействия между процессами как с теоретической, так и с практической стороны; — слишком лаконичный стиль изложения (меньше 300 страниц); — время написания (2014 год, книга чуток устарела).
Но несмотря ни на что, это книга из серии «must have» для погружения в тему. Знания, полученные с её помощью, пригодятся любому серьезному разработчику под Android. И здесь эти знания собраны воедино.
Кстати, есть русская версия под названием «Эффективное использование потоков в операционной системе Android», Ёранссон А.
4. Android Cookbook — Darwin Ian
Это настольная книга для профессиональных Android-разработчиков, которым нужна быстрая справка по теме, с которой возникли сложности. Объяснения в книге лаконичные и поверхностные. Покупая эту книгу, не ожидайте, что вас будут кормить с ложечки.
Но для профессионалов книга просто превосходна. Быстрое руководство и никакого разжёвывания. Среди прочих затрагиваются и сложные темы с решениями, поданными в качестве упражнений.
Для профессионалов и экспертов.
Название на русском — «Сборник рецептов. Задачи и решения для разработчиков приложений», Дарвин Ян.
5. Professional Android (4th edition) — Meier R., Lake I.
Как видно из названия, книга предназначена для опытных разработчиков. В ней описываются лучшие подходы, жизненные циклы Android-приложения и техники UI-дизайна, такие как построение надежного приложения для различных типов экрана, включая планшеты.
Книга включает много примеров реальных приложений, что позволит вам получить практический опыт профессиональной Android-разработки. Но будьте внимательны: это действительно глубокая книга, поэтому для понимания изложенных в ней концепций нужен некоторый опыт в программировании.
Например, в книге изложены такие темы, как JobScheduler, архитектурные компоненты, вступление к Kotlin, шаблоны навигации и шаблоны проектирования. Если вы хотите выйти на новый уровень в Android-разработке — не забудьте прочесть!
Эффективное использование потоков в операционной системе Android
Аннотация
При написании действительно полезного и удобного приложения для Android без многопоточности никак не обойтись, но как узнать о технологиях и методиках, которые помогут решить такую задачу? Эта книга с практической точки зрения описывает несколько асинхронных механизмов, доступных в программной среде Android SDK, а также рассматривает основные принципы и правила выбора одного из них, лучше всего подходящего для создаваемого приложения.
Автор раскрывает все достоинства и недостатки каждой технологии, сопровождая теорию примерами программного кода, и подробно объясняет наиболее рациональные способы их применения. В первой части книги рассматриваются основополагающие компоненты, отвечающие за асинхронную обработку. Во второй части главное внимание уделено библиотекам и программным конструкциям ОС Android, используемым для разработки быстрых, эффективных и правильно структурированных приложений.
Оплата
Наш интернет-магазин работает только по предоплате!
Мы принимаем следующие виды оплаты:
Вы так же можете выбрать оплату по платежной квитанции и оплатить по ней покупку в отделении любого банка.
Юридические лица могут выбрать счёт на оплату.
Возврат денежных средств возможен в случаях:
Возврат не проводится в случаях:
Для оформления возврата обращайтесь по электронной почте dmkpress.help@gmail.com.
Доставка:
Курьерская доставка по Москве в течение 7 дней после оплаты заказа.
Стоимость доставки:
Самовывоз возможен в течение суток после оплаты.
Адрес для самовывоза:
115487, г. Москва, проспект Андропова, 38
Доставка почтой России: от 7 до 28 дней с момента оплаты заказа.
Стоимость доставки:
Многопоточная разработка для Android, часть 1
Содержание статьи
При создании мобильного приложения чуть сложнее «Hello, world» почти наверняка требуется скачать что-то из Сети или считать файл с диска. Для стабильной работы программы в целом эти действия должны совершаться в отдельных потоках. Зачем, когда и как генерировать новые потоки в Android — об этом ты узнаешь в этой статье.
Процессы и потоки
Прежде чем разбираться с Android API, вспомним, какой структурой обладает эта ОС. В ее основе лежит Linux-ядро, в котором реализованы базовые механизмы, присущие всем *nix-системам. В ядре собраны модули, предназначенные для низкоуровневой работы: взаимодействия с железом, организации памяти, файловой системы и так далее.
В мире Linux каждая запущенная программа — это отдельный процесс. Каждый процесс обладает уникальным номером и собственной «территорией» — виртуальным адресным пространством, в рамках которого содержатся все данные процесса. Поток же — это набор инструкций внутри запущенной программы (процесса), который может быть выполнен отдельно. У потока нет своего уникального идентификатора и адресного пространства — все это он наследует от родительского процесса и делит с другими потоками.
Xakep #208. Атака на сигналку
Такое положение дел приводит к тому, что со стороны неизвестно, как протекает жизнь внутри процесса, есть ли там потоки и сколько их, — для ОС и других процессов это атомарная структура с уникальным идентификатором. Поэтому ОС может манипулировать лишь процессом, а управляет потоками только породивший их процесс. Вообще, внутренний мир операционных систем очень интересен, поэтому советую читателям почитать что-нибудь из классической литературы по Linux.
Когда в компьютерах (а вслед за ними — в планшетах и телефонах) появились процессоры с несколькими ядрами, программисты внедрили в ОС планировщик задач. Такой планировщик самостоятельно распределяет нагрузку по всем ядрам процессора, исполняя блоки кода параллельно или асинхронно, и тем самым повышает производительность. Поначалу маркетологи даже продавали компьютеры с лозунгом «Два ядра — в два раза быстрее», но, к сожалению, действительности он не соответствует.
В Android программист обязан повсеместно создавать новые потоки и процессы. Все операции, которые могут продлиться более нескольких секунд, должны обязательно выполняться в отдельных потоках. Иначе начнутся задержки в отрисовке интерфейса и пользователю будет казаться, что приложение «зависает».
Вообще, суть многопоточного программирования в том, чтобы максимально задействовать все ресурсы устройства, при этом синхронизируя результаты вычислений. Это не так легко, как может показаться на первый взгляд, но создатели Android добавили в API несколько полезных классов, которые сильно упростили жизнь Java-разработчику.
Потоки в Android
Запущенное в Android приложение имеет собственный процесс и как минимум один поток — так называемый главный поток (main thread). Если в приложении есть какие-либо визуальные элементы, то в этом потоке запускается объект класса Activity, отвечающий за отрисовку на дисплее интерфейса (user interface, UI).
В главном Activity должно быть как можно меньше вычислений, единственная его задача — отображать UI. Если главный поток будет занят подсчетом числа пи, то он потеряет связь с пользователем — пока число не досчиталось, Activity не сможет обрабатывать запросы пользователя и со стороны будет казаться, что приложение зависло. Если ожидание продлится чуть больше пары секунд, ОС Android это заметит и пользователь увидит сообщение ANR ( application not responding — «приложение не отвечает») с предложением принудительно завершить приложение.
Рис. 2. ANR-сообщение
Получить такое сообщение несложно — достаточно в главном потоке начать работу с файловой системой, сетью, криптографией и так далее. Как ты понимаешь, это очень плохая ситуация, которая не должна повторяться в штатных режимах работы приложения.
Thread и Runnable
Но при такой организации сложно использовать всю силу дополнительных потоков — нельзя ни поменять задачу, ни поcмотреть результат вычислений. Хотя все это происходит в едином адресном пространстве, у Java-разработчика нет возможности просто так получить ресурсы соседних потоков.
Looper
Было бы классно уметь перекидывать данные из одного потока в другой. В Android, как и любой Linux-системе, это возможно. Один из доступных в Android способов — это создать очередь сообщений (MessageQueue) внутри потока. В такую очередь можно добавлять задания из других потоков, заданиями могут быть переменные, объекты или кусок кода для исполнения (Runnable).
Чтобы организовать очередь, нужно воспользоваться классами Handler и Looper: первый отвечает за организацию очереди, а второй в бесконечном цикле проверяет, нет ли в ней новых задач для потока.
AsynkTask
Загружая или вычисляя что-то в фоне, хорошо бы не только получить результаты, но еще и иметь возможность выводить пользователю информацию о прогрессе. Конечно, все это можно сделать самому с помощью очереди сообщений, но разработчики Android и тут упростили нам жизнь, создав класс AsyncTask.
Класс AsyncTask — это представитель Java-обобщений (generic) в мире Android. У классов-обобщений заранее не определен тип данных, с которыми им предстоит работать. Этот прием позволяет создать класс, который в последующем сможет без проблем работать с любым типом данных. В данном случае благодаря дженерику AsynkTask возможно запускать новые потоки с совершенно произвольными объектами внутри.
C помощью AsyncTask теперь можно почти не думать (о вероятных последствиях позже) о создании потока, а просто создать объект и обрабатывать результаты. К примеру, с помощью AsyncTask удобно преобразовывать файлы (например, их зашифровать), при этом сам метод шифрования modifyFile может быть объявлен в Activity главного потока.
Для запуска нового потока достаточно одной строчки в Activity:
С появлением AsyncTask разработчики обрели практически универсальный инструмент, позволяющий в короткие сроки написать код, генерирующий новые потоки, а потом так же быстро получить в UI результаты вычислений, отслеживая при этом прогресс. Но у этого класса есть несколько неприятных моментов, которые могут сделать приложение совершенно нестабильным.
Сложность с отменой
Потеря результатов
Утечка памяти
А это самый неприятный недостаток AsyncTask, который напрямую следует из предыдущего пункта. После запуска нового Activity прошлый экземпляр UI должен быть выгружен из памяти сборщиком мусора. Но этого не произойдет, поскольку на «старый» UI есть ссылка в работающем потоке, созданном AsyncTask. Ничего не поделать, придется создавать еще один поток и запускать все вычисления в нем по новой. Но есть риск, что пользователь опять повернет экран! При такой организации рабочего процесса вся выделенная память потратится на содержание ненужных Activity и дополнительных потоков, и ОС принудительно завершит приложение с ошибкой OutOfMemoryException.
Что же делать?
Сделать экземпляр AsyncTask статическим и использовать слабые связи (WeakReference). При таком подходе в приложении не будут генериться лишние потоки, а слабая связность позволит сборщику мусора выгрузить ненужные Activity из памяти.
WeakReference
Немного о связях в Java. Создавая новый объект и ассоциируя его с переменной, мы создаем ссылку между ними. Привычное создание объекта сопровождается созданием сильной (strong) ссылки.
В работающей программе неизвестно, в какой момент начнет свой очередной проход сборщик мусора. Поэтому лучше перестраховаться и каждый раз получать доступ к объекту по слабой ссылке.
Loaders
Пожалуй, основная задача 90% всех мобильных приложений вообще — это быстро и незаметно для пользователя загрузить данные из сети или файловой системы, а затем красиво отобразить их на дисплее. Для всего этого отлично подходит AsyncTask, но его проблемы не только неочевидны для неопытных разработчиков, но и плохо детектируются в процессе отладки.
Массовое распространение в Google Play приложений, имеющих проблемы с утечкой памяти, резонно вызовет у пользователей ощущение, что «Android тормозит». Компания Google решила взять ситуацию под свой контроль и добавила в API класс-загрузчик (Loader), который еще больше упрощает генерацию потоков и самостоятельно обходит слабые места AsyncTask. Создание нового потока теперь ведется через класс AsyncTaskLoader, который обязательно должен быть статическим.
Проблемы, которые вылезли в AsyncTask, решены путем введения промежуточного звена — менеджера загрузки. Класс LoaderManager.LoaderCallbacks управляет созданным потоком и по окончании вычислений возвращает данные в действующий Activity. Теперь достаточно быстро можно создать код, экономящий ресурсы и решающий проблему перезапуска Activity: вычисления продолжатся в самом первом потоке, а менеджер подключит новый Activity к ранее созданному потоку.
Для примера поместим на экран ListView, данные для которого поступят из сгенерированного потока. Менеджер потока тоже класс-дженерик, сегодня он будет работать со списком строк.
Теперь нужно создать менеджер и подключить к нему поток (Loader). Под управлением у менеджера может быть несколько потоков с уникальными номерами, но менеджер в Activity должен быть только один.
Данные будут обновляться после нажатия кнопки — к примеру, FloatingActionButton. Для доступа к менеджеру из обработчика setOnClickListener нужно добраться до контекста приложения и вытащить оттуда экземпляр класса LoaderManager.
По каким-то причинам в загрузчике не был реализован аналог метода onProgressUpdate из AsyncTask. Но это возможно сделать самостоятельно, передавая данные в UI с помощью слабых ссылок.
To be continued
Сегодня мы разобрали особенности генерации потоков, которые могут быть не так очевидны, когда ты только-только начинаешь работать с Java или Android. Надеюсь, мир операционной системы от Google стал немножко понятней и у тебя появилось желание написать что-нибудь самому.
Тема потоков и процессов слишком большая, чтобы ее раскрыть в одной статье. Есть даже программисты, которых ценят именно за то, что они лучше всех умеют распараллеливать программу! Нам еще есть о чем поговорить — в стороне остались сервисы и процессы, поэтому в следующем номере мы продолжим разбираться с многопоточностью в Android. Пока почитай что-нибудь самостоятельно по теме, а если будут вопросы — пиши мне на почту. Удачи!