Android studio kotlin учебник

Несколько книг для начинающего и продолжающего разработчика под Android

В прошлом году я входил в миры Android. Помимо изучения исходников, документации, статей, блогов, аудио- и видео-материалов по теме, читал книги. Спешу поделиться читательским опытом.

Под катом небольшой обзор восьми книг. Темы следующие:

  1. RxJava
  2. Потоки в Android
  3. Разработка под Android на Java
  4. Kotlin. Обзор языка
  5. Kotlin. Практика
  6. Kotlin. Обзор языка с уклоном на Android
  7. Разработка под Android на Kotlin
  8. Rx в Kotlin

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

Efficient Android Threading: Asynchronous Processing Techniques for Android Applications. By Anders Goransson. O’Reilly Media; 1 edition June 13, 2014; 280 pages;
ISBN-13: 978-1449364137
Книга делится на две части. В первой вы узнаете, что находится под капотом операционной системы (ОС) Android: из каких компонентов состоит ОС, как организовано взаимодействие между потоками и между процессами, и как Android организует управление памятью. Во второй части вы научитесь управлять потоками и процессами, узнаете различные механизмы для этого, познакомитесь подробней Service и фреймворком Loader .

Из минусов, на мой взгляд, можно назвать то, что в книге не слишком подробно объясняется взаимодействие между процессами (фрейворк Binder, AIDL), как с теоретической, так и с практической стороны. И, поскольку, книга написана до второй половины 2014 года, мы не найдем в ней то, что появилось с момента выхода Android Lollipop 5.0. Например, можно вспомнить планирование задач с использованием JobScheduler, Doze Mode, ограничения на запуск Service , которые мы получили в Android Oreo 8.0… etc.

То, что есть недостатки, можно отнести скорее к лаконичному стилю изложения (книга обложка перевода

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.

Источник

Пишем MVP приложение на Kotlin под Android

Разработка приложений на Kotlin под Android набирает популярность среди разработчиков, однако статей в русскоязычном сегменте Интернета довольно мало. Я решил немного подправить ситуацию, и написать туториал по разработке приложения на Kotlin. Мы напишем полноценное приложение с использованием всех трендовых библиотек (кроме RxJava) в мире Android-разработки. В конце у нас должно получиться расширяемое и легко тестируемое приложение (сами тесты мы писать не будем).

Читайте также:  Разряд батареи андроид самсунг

Внимание! В статье описывается создание приложения версии 1.0. Текущий код в репозитории может отличаться от описываемого в статье.

Наверное, некоторые из вас знают, что помимо языка программирования Kotlin JetBrains также разрабатывает библиотеку Anko, для создания UI приложения, в качестве замены обычным XML-файлам. Мы не будем использовать его в нашем проекте, дабы не ставить в затруднительное положение людей не знакомых с Anko.

Настройка Android Studio

Для написания приложений на языке Kotlin, Android Studio нужен специальный плагин. Инструкцию по установке плагина можно найти здесь. Также не забудьте отключить функцию «Instant Run» в настройках Android Studio, т. к. на данный момент она не поддерживается плагином Kotlin.

Для корректной работы генерации кода нужно использовать версию плагина не ниже 1.0.1. Я использовал версию Kotlin 1.0.2 EAP. Вот так выглядит файл build.gradle приложения в моем проекте:

Что будем писать?

Итак, для начала нам нужно определиться что же мы будем писать? Недолго думая я остановился на приложении-заметках. Название тоже придумалось легко — Notelin. Приложение очень простое и состоит из двух экранов:

— Главный экран — содержит в себе список с заметками
— Экран заметки — здесь можно смотреть/редактировать содержание выбранной заметки

Требования к приложению небольшие:

— Добавление/просмотр/удаление заметки
— Просмотр информации о заметке
— Сортировка заметок по заголовку и по дате
— Поиск по заголовкам заметок

Используемые библиотеки

Для работы с базой данных я буду использовать библиотеку Android Active. Урок по работе с ней можно найти по этой ссылке. Для реализации Depency Injection была использована библиотека Dagger 2. На Хабре есть много статей по работе с ней. Основой всего приложения будет библиотека Moxy. С ее помощью мы реализуем паттерн MVP в нашем проекте. Она полностью решает проблемы жизненного цикла, благодаря чему вы можете не переживать о пересоздании компонентов вашего приложения. Также мы воспользуемся набором расширений для языка Kotlin в Android — KAndroid. Про остальные библиотеки я буду рассказывать по ходу дела.

Ниже приведен список зависимостей проекта:

А вот так выглядит список зависимостей приложения:

Обратите внимание, что вместо apt я использую kapt. Это плагин для Gradle, позволяющий аннотировать Kotlin-элементы.

Структура приложения

Вот так выглядит структура нашего проекта в конечном варианте:

Создаем Model

У заметок будет четыре поля:

  • Дата создания
  • Дата изменения
  • Заголовок
  • Текст

Реализуем все это в коде:

По этой модели библиотекой ActiveAndroid будет создана БД, в которой будут храниться наши заметки. Если вы заметили, у нас есть два конструктора: пустой и с параметрами. Первый конструктор будем использовать мы, а второй — ActiveAndroid. Наша модель наследуется от класса Model, благодаря чему мы можем сохранять и удалять наши заметки просто вызывая методы save() и delete(), например:

Но прежде чем использовать нашу модель, нам нужно прописать кое-какие мета-данные в Manifest-файле:

Думаю, все понятно без комментариев. Осталось унаследовать класс Application от com.activeandroid.app.Application:

Чтобы приложение было менее зависимо от БД я создал обертку NoteDao над нашей моделью, в которой будут происходить все операции по созданию, сохранению, обновлению и удалению заметок:

Наверное, вы заметили, что для создания объектов мы не использовали ключевое слово new — это отличие Kotlin от Java.

Экран с заметками

Также является главным экраном приложения. На нем пользователь может добавить/удалить заметку, просмотреть информацию о заметке, отсортировать их по дате или названию, а также произвести поиск по заголовкам.

Создаем MainView и MainPresenter

Теперь нам нужно перевести все это в код. Для начала создадим интерфейс нашей View:

Далее мы реализуем созданный интерфейс в нашей активити:

Одной из особенностей Kotlin, является то, что наследование и реализация интерфейсов указывается через двоеточие после имени класса. Также не имеет разницы идет название родительского класса перед интерфейсами, после или даже между ними, главное, чтобы класс в списке был один. Т. е. запись выше могла бы выглядеть так:

Если же вы попытаетесь добавить через запятую название еще одного класса, то IDE выдаст ошибку и подчеркнет красной линией название класса, который идет вторым.

Пока оставим методы пустыми. Как видите, активити наследуется от MvpAppCompatActivity. Это нужно для того, чтобы активити могла восстанавливать состояние при повороте экрана.

Создадим класс презентер:

Презентер также наследуется от MvpPresenter, которому мы указываем с какой View мы будем работать.Осталось инжектировать нашу модель в презентер. Для этого мы создаем модуль — поставщика NoteDao:

Создадим Component для инжектирования презентера:

Теперь нам нужно создать статический экземпляр класса AppComponent в классе Application:

Теперь мы можем инжектировать нашу модель в презентере:

Для взаимодействия MainView и MainPresenter нам нужно создать переменную в MainActivity:

Плагин Moxy сам привяжет View к фрагменту и произведет другие необходимые действия.

Создадим разметку экрана со списком и плавающей кнопкой. Файл activity_main.xml:

Для реализации летающей кнопки я использовал библиотеку FloatingActionButton. Google уже добавили FAB в support-библиотеку, поэтому вы можете воспользоваться их решением.

Укажем нашей Activity, какой макет она должна показывать:

Далее нам нужно связать FAB и список, чтобы при прокручивании списка вверх кнопка исчезала:

Нам не нужно писать порядком надоевший findViewById, нужно лишь прописать одну строчку в блоке с import’ами:

Как видите, последний пакет совпадает с названием нашего xml-файла. IDE автоматически инициализирует свойства (property) наших View и их имена совпадают с ID, которые мы указали в разметке.

Давайте реализуем загрузку заметок из БД. Заметки нужно загружать только один раз и использовать их в последующем. В этом нам поможет метод onFirstViewAttach класса MvpPresenter, который вызывается единожды при первой привязке View к презентеру. Далее, сколько бы мы не крутили и вертели нашу Activity, данные будут закешированы в презентере.

Создадим адаптер для нашего списка:

В адаптере мы используем метод formatDate. Он служит для форматирования даты в строку:

Читайте также:  Бустер звука для андроид

Данный метод находится в файле DateUtils.kt и мы можем использовать как обычный статический метод. Отличие от статического метода здесь в том, что метод принадлежит не классу, а пакету и нам не нужно писать имя класса перед названием метода. В аннотации мы указываем название класса, через который мы будем обращаться к методу из Java. Например в Java дынный метод будет вызываться так:

В методе onNotesLoaded нашей Activity мы показываем наши заметки:

Если заметок нет, то мы показываем сообщение «Нет заметок» в TextView.

Насколько я знаю, для обработки клика по элементам RecycleView не существует «официального» OnItemClickListener. Поэтому мы воспользуемся своим решением:

В методе onCreate нашей Activity пишем:

Функция with позволяет не писать каждый раз имя переменной, а только лишь вызывать методы у объекта, который мы передали в нее. Обратите внимание, что для получения Activity я использовал не просто this, а this@MainActivity. Это связано с тем, что при использовании this в блоке with, возвращается объект, который мы передали в функцию with. При обычном клике по пункту мы переходим на Activity, где мы можем просмотреть текст нашей заметки. При долгом нажатии появляется контекстное меню. Если вы заметили, перед закрывающей скобкой я не написал слово return. Это не ошибка, а особенность языка Kotlin.

Вот что происходит при нажатии на пункт меню в презентере:

Мы еще не создали класс NoteActivity, поэтому компилятор будет выдавать ошибку. Для решения этой проблемы можно создать класс NoteActivity или вовсе закомментировать код внутри метода openNote. Запись NoteActivity::class.java аналогична NoteActivity.class в Java. Также заметьте, что мы обращаемся к списку не через метод get(position), а через квадратные скобки, как к обычному массиву.

При использовании MVP-библиотеки Moxy в своем приложении, нам нужно привыкать, что все действия с View, такие как показ/закрытие диалога и другие, должны проходить через презентер. Изначально это не очень привычно и неудобно, но пользы от этого гораздо больше, т. к. мы можем быть уверены, что при пересоздании Activity наше диалоговое окно никуда не пропадет.

Я не буду показывать код контекстного меню, удаления и показа информации о заметке т. к. статья получается очень большой. Но, думаю, общий смысл вы уловили. Также следует отметить, что метод hideNoteContextDialog у презентера должен вызываться даже при закрытии диалога через кнопку назад или при нажатии на область за границами диалога.

При нажатии на FAB должна создаваться новая заметка:

Для создания новой заметки мы вызываем у презентера функция openNewNote:

Метод openNewNote использует созданный нами ранее openNote, в который мы передаем Context и позицию заметки в списке.

Реализуем поиск по заметкам

Давайте добавим поиск по заметкам. Создайте в папке res/menu файл main.xml:

В MainActivity пишем:

При изменении текста в поле поиска мы передаем строку из поля в презентер, после чего показываем результаты в списке. На самом деле, у SearchView нет метода onQueryChange, его добавила библиотека KAndroid.

Реализуем поиск в презентере:

Обратите внимание, как красиво, в одну строчку мы реализовали поиск по списку с помощью метода filter и лямбд. В Java тот же функционал занял бы 6-7строк. Осталось отобразить результаты поиска:

Реализуем сортировку заметок

И последний этап в создании главного экрана, это сортировка заметок. Добавим в res/menu/main.xml следующие строки:

Теперь нам нужно обработать нажатие на пункты меню:

Оператор when является более функциональным аналогом switch-case в Java. Код сортировки в MainPresenter:

Экран с содержанием заметки

Теперь нам нужно создать экран с содержанием заметки. Здесь пользователь может просмотреть/отредактировать заголовок и текст заметки, сохранить или удалить ее, а также просмотреть информацию о заметке.

Создаем NoteView и NotePresenter

Экран содержит всего лишь три View:

-Заголовок
-Дата последнего изменения
-Текст заметки

А вот и сама разметка:

В начале статьи я мельком упомянул об Anko. Библиотека позволяет существенно сократить код, не теряя при этом в удобочитаемости. Вот так, например, выглядела бы наша разметка при использовании Anko:

Но не будем отвлекаться и приступим к написанию кода. Первым делом нам нужно создать View:

Имплементируем NoteView в NoteActivity:

В onCreate мы извлекаем id заметки, чтобы презентер достал заметку из БД и передал данные во View. Создадим презентер:

Не забудьте добавить в класс AppComponent строку:

Покажем нашу заметку:

Реализуем сохранение заметки

Для сохранения заметки нам нужно выбрать соответствующий пункт в меню. Создайте файл res/menu/note.xml:

Опять же, я не стал приводить код удаления и вывода информации о заметке. При просмотре исходного кода, вы можете заметить, что помимо идентификатора заметки я передал в NoteActivity позицию заметки в списке. Это нужно для того, чтобы при удалении заметки на экране просмотра заметки, она также удалялась из списка. Для реализации этого функционала я использовал EventBus. И опять, я не стал приводить код.

На этом все: заметки добавляются, редактируются и удаляются. Также мы можем осуществить поиск и сортировку заметок. Обязательно посмотрите полный исходный код, ссылку на который я привел в конце статьи, чтобы лучше понять как все устроено.

Благодарности

Конечно же, нельзя забывать о людях, которые помогли мне при написании статьи. Хотел бы выразить благодарность хабраюзерам Юрию Шмакову (@senneco) за помощь с его библиотекой Moxy и за помощь по другим вопросам. Также, хочу сказать спаcибо сотруднику JetBrains Роману Белову (@belovrv) за ревью статьи и за предоставленный код на Anko.

UPD: Еще хотел сказать спасибо Sirikid за EPIC COMMIT, благодаря которому я переделал внушительную часть кода с использованием фич Kotlin’а.

Заключение

Надеюсь, эта статья смогла убедить вас в том, что писать приложения на Kotlin не трудно, а может даже и легче, чем на Java. Конечно же, могут встречаться и баги, которые сотрудники JetBrains достаточно быстро фиксят. Если у вас появились какие-либо вопросы, вы можете задать их напрямую разработчикам на Slack-канале. Также вы можете почитать статьи о разработке на Kotlin здесь.

Источник

Оцените статью