Цель заброшена
Автор не отписывался в цели 3 года 6 месяцев 13 дней
Android (Kotlin) разработка: от Junior к Middle
Дано: есть знание Java Android на среднем уровне, Kotlin Android - на уровне "Intern")) Сразу все пункты писать долго и сложно. Так что со временем пункты будут модифицироваться и изменяться.
Хочу 1: уверенный в себе middle-специалист на интересном проекте (пока нахожусь на должности инженера - программиста под Андроид);
Хочу 2: Карьерный и профессиональный рост;
Хочу 3: Трудовая миграция в Европу;
Хочу 4: Дополнительно изучить Java с фреймворков Spring для бэк - стороны приложений.
Критерий завершения
Позиция Middle в IT компании
Личные ресурсы
Время
Экологичность цели
Достичь цели могу только я, никто вместо меня не сделает)
-
Котлин в действии "Kotlin in Action"
Прочесть рекомендованную книгу и плотно разобраться с особенностями языка Котлин (хоть данная книга и довольно таки не проста в освоении).
Введение в KotlinKotlin, что это и зачемОсновы KotlinОпределение и вызов функцийКлассы, объекты и интерфейсыЛямбда-выраженияСистема типов KotlinПерегрузка операторов и другие соглашенияФункции высшего порядкаОбобщённые типыАннотации и механизм рефлексииКонструирование DSLСборка проектов на KotlinДокументирование кода на KotlinЭкосистема Kotlin
-
Компоненты Android
Основные компоненты Android:
– Activity– Service– Broadcast receiver– Content provider
-
Clean Code. Чистая архитектура. Роберт Мартин
Прочесть книгу и разобраться в свойствах "Чистая архитектура" от Роберта Мартина.
Часть I. ВведениеЧасть II. Начальные основы: парадигмы программирования.Часть III. Принципы дизайна.Часть IV. Принципы организации компонентов.Часть V. Архитектура.Часть VI. Детали.- Часть VII. Приложение.
-
LifeCycler
LifeCycle;ViewModel;Room;Paging Library;DataBinding;Navigation;WorkManager;Практика.
-
Прочесть книгу "Думай как математик"
Данная книга призвана помочь изучать / осваивать / повторять любые науки (в том числе и технические) в более простом смысле, то есть - учит разделять изучение какого либо материалы по двум подходам, а именно:
- Сфокусированный;
- Рассеянный.
Принципиальная разница этих подходов в том, что сфокусированный подход - это то, что вы пытаетесь изучить / запомнить сейчас, а рассеянный - это то, что изучает ваше сознание в "фоновом режиме". Книга учит, как правильно использовать данные подходы.
-
Дополнительная информация по классу Bundle и Hundler
-
Dagger 2
1. Dagger 2 https://github.com/google/dagger
2.
Dependency Injection in Android with Dagger 2 and Kotlin https://www.raywenderlich.com/171327/dependency-i...3.
. Dagger 2: Part1 https://habr.com/post/279125/4.
Dagger 2: Part2 https://habr.com/post/279641/5. Dagger 2: Part3 https://habr.com/ru/post/320676/
6. Изучение Parcelable
7. StartAndroid: https://startandroid.ru/ru/courses/dagger-2/16-course/dagger2/8. Хорошая ссылка туториал по Dagger 2 + Kotlin + MVP: https://www.raywenderlich.com/262-dependency-injection-in-android-with-dagger-2-and-kotlin
-
Герберт Шилдт, Java
Изучить книгу, которая необходимо для любого Java программиста
-
Architecture Knowledge
MVC/MVP/MVVM https://academy.realm.io/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/Реализовываем MVVM в Android: https://stfalcon.com/ru/blog/post/android-mvvm/- Android Architecture Components. Handling lifecycles https://developer.android.com/topic/libraries/architecture/lifecycle
ViewModel https://developer.android.com/topic/libraries/architecture/viewmodelLiveData https://developer.android.com/topic/libraries/architecture/livedata- Saving UI States https://developer.android.com/topic/libraries/architecture/saving-states
- Room Persistence Library https://developer.android.com/topic/libraries/architecture/room
Clean Architecture https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/Clean Architecture in Android https://github.com/AndroidArchitecture/AndroidArchitectureBook- Architecting Android...The evolution https://fernandocejas.com/2015/07/18/architecting-android-the-evolution/
- Adding DI to Clean Architecture Tasting Dagger 2 on Android https://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/
- Clean architecture using Android Architecture Componentsd https://fernandocejas.com/2018/05/07/architecting-android-reloaded/
Android MVP for Beginners https://android.jlelse.eu/android-mvp-for-beginners-25889c500443Mosby: Getting started http://hannesdorfmann.com/mosby/getting-started/Moxy — реализация MVP под Android с щепоткой магии https://habr.com/post/276189/Moxy. Как правильно пользоваться? https://www.slideshare.net/profyclub_ru/moxy-arello-mobile- Android Architecture Components https://developer.android.com/topic/libraries/architecture/
ViewModel Overview https://developer.android.com/topic/libraries/architecture/viewmodelLiveData overview https://developer.android.com/topic/libraries/architecture/livedata- Handling lifecycles with lifecycle-aware components https://developer.android.com/topic/libraries/architecture/lifecycle
- Saving UI States https://developer.android.com/topic/libraries/architecture/saving-states
ViewModel и LiveData: паттерны и антипаттерны https://habr.com/post/338590/Architecture Components https://startandroid.ru/ru/courses/architecture-components.htmlExample application MVPExample application MVVMAndroid JetPack https://habr.com/ru/post/471670/
-
RxJava
- RxJava: What's different in 2.0 https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0
- RxJava https://github.com/ReactiveX/RxJava
- RxAndroid https://github.com/ReactiveX/RxAndroid
- RxAndroid: Extensions https://github.com/ReactiveX/RxAndroid/wiki
- Backpressure https://github.com/ReactiveX/RxJava/wiki/Backpressure
-
JavaRush
Для разнообразия и дополнительного развития, хочу достигнуть 35 уровня на сайте JavaRush. В нем используется довольно - таки хорошее содержание занятий, лекций, а так же доп лекций для изучения.
-
Изучить основные "Паттерны проектирования" (шаблоны проектирования)
В данной книге очень хорошо описываются основные паттерны проектирования, используемые при создании различных программ. Сами по себе паттерны - это решение, какой либо часто встречающейся проблемы. То есть, не нужно "изобретать велосипед" - для решения вашей проблемы, уже скорее всего, существует решение, ставшее в некотором смысле "стандартным".
-
Android Academy Fundamentals
Начал проходить курсы от Android Academy Global, а именно Android Fundamentals) . Список видео-уроков.
Данный пост будет обновляться по мере прохождения курсов.
Android Fundamentals #0;Android Fundamentals #1;Android Fundamentals #2;Android Fundamentals #3;Android Fundamentals #4;Android Fundamentals #5 Multithreading;Android Fundamentals #6;Android Fundamentals #7;Android Fundamentals #8;- Android Fundamentals #9: Persistency.
- Android Fundamentals #10;
- Android Fundamentals #11;
Домашка:
-
Вопросы по собеседованиям
Кому интересно - ответы на вопросы по собеседованиям:
Что такое Doze Mode?
- Это "режим отключки" в который входит устройство, если оно долго не используется и не подключено к зарядке. Этот режим заставляет приложения "меньше жрать" батарею устройства. Впервые внедрен в версии Android Marshmallow.
В чем разница между "Activity Context" и "Application Context"?
- Activity Context создается при создании активити и уничтожается вместе с активити. Контекст – тяжелый объект. Когда говорят об утечке памяти в андроиде, имеют в виду утечку контекста, т.е. ситуацию, когда контекст активити хранится после вызова Activity.onDestroy(). Не передавайте контекст активити в другой объект, если не известно как долго этот объект проживет.
- Application Context – синглтон. Application Context создается при создании объекта Application и живет, пока жив процесс приложения. По этой причине Application Context можно безопасно инжектить в другие синглтоны в приложении.
Отличия горячего (hot) и холодного(cold) наблюдателя:
- Горячий наблюдатель всегда публикует ивенты и при подписке на него подписчик, не получает предидущие ивенты, а получает их только на моменте подписки и далее;
- При подписке на холодный наблюдатель подписчик получает все предидущие, текущие и последующие ивенты.
Как работают методы subcribeOn( ) и observeOn( )?
- subscribeOn() – задает Scheduler, на котором выполняется подписка на Observable. Другими словами, код метода Observable.create() выполняется в потоке, заданном subscribeOn(). Оператор subscribeOn задает поток только для оператора создания. Scheduler, который задает subscribeOn() действует от создания Observable и вниз по цепочке вызовов RxJava до первого observeOn(). Место вызова subscribeOn() в цепочке не имеет значения. Если subscribeOn() вызывается несколько раз на одном Rx-стриме, то в большинстве случаев только первый вызов имеет эффект.
- observeOn() – задает Scheduler, на котором выполняются операторы, следующие после observeOn(). В Rx-стриме может быть несколько observeOn(), каждый из которых будет менять поток выполнения.
Виды Schedulers:
- Schedulers.io() – наиболее распространенный вид scheduler’a. Этот тип используется для сетевых запросов, операций чтения данных из файла, записи или чтения данных из БД. Такой планировщик (scheduler) создаёт необходимое количество потоков для эффективного выполнения вашей задачи, удаляет ненужные, и старается переиспользовать потоки, которые могут понадобится.
- Schedulers.computation() – этот вид планировщика используется для математичсеких вычислений.Такой тип планировщика удобен тем, что создает количество потоков, соответствующее числу ядер в процессоре для параллельной обработки.
- Schedulers.newThread() – создаёт новый поток для каждого активного Observable, не пытаясь переиспользовать ранее созданные потоки. Важно понимать, что в сложных задачах количество созданных threads не ограничено, и можно “уронить” приложение из-за нехватки памяти.
- Schedulers.single() – такой планировщик можно рассматривать, если вам необходимо выполнить всю работу последовательно в одном потоке. Такой тип планировщика может быть полезен если необходимо выполнить потоконебезопасный код в отдельном потоке.
- Schedulers.trampoline() – выполняет код в текущем потоке, используется для последовательного выполнения задач
Что такое Дженерики?
- Generics (Дженерики) - это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. В угловых скобках используется T - имя параметра типа. Это имя используется в качестве заполнителя, куда будет подставлено имя реального типа, переданного классу при создании реальных типов.
Принципы чистой архитектуры (Clean Architecture):
- «Независимость от фреймворков". Архитектура не зависит от наличия какой-либо библиотеки. Это позволяет рассматривать фреймворки как инструменты, вместо того чтобы стараться втиснуть систему в их рамки.
- "Простота тестирования". Бизнес-правила можно тестировать без пользовательского интерфейса, базы данных, веб-сервера и любых других внешних элементов.
- "Независимость от пользовательского интерфейса". Пользовательский интерфейс можно легко изменять, не затрагивая остальную систему. Например, веб-интерфейс можно заменить консольным интерфейсом, не изменяя бизнес-правил.
- "Независимость от базы данных". Вы можете поменять Oracle или SQL Server на Mongo, BigTable, CouchDB или что-то еще. Бизнес-правила не привязаны к базе данных.
- "Независимость от любых внешних агентов". Ваши бизнес-правила ничего не знают об интерфейсах, ведущих во внешний мир.»
- Принципы SOLID.
Что такое equals( ) и HashCode ( ) и какой у них контракт?
- Метод equals() необходим в Java для подтверждения или отрицания того факта, что два объекта одного происхождения являются логически равными.
- Hash (Хэш) — это некоторое число, генерируемое на основе объекта и описывающее его состояние в какой-то момент времени. Это число используется в Java преимущественно в хэш-таблицах, таких как HashMap.
- Если хеш-коды разные, то и входные объекты гарантированно разные.
- Если хеш-коды равны, то входные объекты не всегда равны.
- Эквивалентность (equals) и хеш-код (hashCode) тесно связаны между собой, поскольку хеш-код вычисляется на основании содержимого объекта (значения полей) и если у двух объектов одного и того же класса содержимое одинаковое, то и хеш-коды должны быть одинаковые
LaunchMode для Активити:
- standart - этот мод позволяет создавать новую активность для каждого интента;
- singleTop - по сути то же, что и standart, разница лишь в том, что если уже имеется активность с таким же типом наверху стека, то новая активность не будет создана, а лишь получит интент методом onNewIntent( );
- Activity с singleTask launchMode разрешено иметь только один экземпляр в системе (аля синглтон);
- Этот режим очень похож на singleTask, где в системе мог существовать только один экземпляр Activity. Разница в том, что задача, которая располагает этим Activity, может иметь только одно Activity — то, у которого атрибут singleInstance.
Что такое volatile?
- Если переменная объявлена как volatile, это означает, что она может изменяться разными потоками.
Виды исключений в Java?
- У всех исключений есть общий класс-предок Throwable.
От него происходят две большие группы — исключения (Exception) и ошибки (Error).
Error — это критическая ошибка во время исполнения программы, связанная с работой виртуальной машины Java. В большинстве случаев Error не нужно обрабатывать, поскольку она свидетельствует о каких-то серьезных недоработках в коде.
Наиболее известные ошибки: StackOverflowError — возникает, например, когда метод бесконечно вызывает сам себя, и OutOfMemoryError — возникает, когда недостаточно памяти для создания новых объектов. Exceptions — это, собственно, исключения: исключительная, незапланированная ситуация, которая произошла при работе программы (RuntimeException и IOException).
Content Provider:
- Content Provider – это способ расшарить для общего пользования данные вашего приложения. Обычно это данные из БД. И создание класса провайдера похоже на создание обычного класса для работы с БД. Мы используем SQLiteOpenHelper для управления базой, и реализуем методы query, insert, update, delete класса ContentProvider.
Операторы в RxJava:
- from - Этот оператор мы уже встречали в первом уроке. Он создает Observable из массива или коллекции.;
- just - just обрабатывает все как элемент, независимо от того, является ли это элементом массива или целым элементом.
- range - Оператор range выдаст последовательность чисел;
- interval - Оператор interval выдает последовательность long чисел начиная с 0. Мы можем указать временной интервал, через который числа будут приходить;
- fromCallable - Если у вас есть синхронный метод, который вам надо сделать асинхронным, то оператор fromCallable поможет вам.
Разница в работе just( ) и from ( ):
- Оператор Just( ) принимает список аргументов и преобразует элементы в наблюдаемые элементы. Он принимает аргументы от одного до десяти (но в официальном документе говорится, что от одного до девяти, может быть, для конкретного языка).
- В отличие от just, From() создает Observable из набора элементов, используя Iterable, что означает, что каждый элемент испускается по одному за раз.
onNext, onError, onCompleted в RxJava:
- По мере того, как он один за другим обрабатывает сайты, он генерирует события Next, в которые передает результат. Т.е. каждый найденный рейс - новое событие Next.
- Если в работе метода произошла какая то серьезная ошибка и продолжение работы невозможно, метод отправит событие Error.
- Если метод успешно обработал все известные ему сайты и закончил работу, он отправит нам событие Completed.
Известные способы передачи данных в приложении:
- Serializable и Parcelable;
- SharedPreferences;
- Запись в локальную БД;
- Через синглтон.
Отличие flowable ( ) от observable ( ):
- Observable( ) используется, когда у нас относительно мало элементов за время и нет риска переполнения памяти. Если есть вероятность того, что память может быть переполнена, мы используем Flowable. Одним из примеров может быть получение огромного количества данных с датчика. Обычно они отправляют данные с высокой скоростью.
- А так же, Flowable( ) поддерживает механизм backpressure, а observable ( ) - нет.
Отличие single ( ) от observable ( ):
Single предоставит там либо один элемент в onNext (или же от Success), либо ошибку в onError, после чего передача данных будет считаться завершенной. onComplete у данного источника отсутствует.
Механизм Backpressure:
Backpressure – это ситуация, когда Observable производит больше элементов, чем может обработать Observer. Например Observable создает 1000 элементов в секунду, а Observer обрабатывает 1 элемент в секунду.
Сравнение в Kotlin:
- Оператор == в Kotlin позволяет сравнивать данные, содержащиеся в переменных.
- Метод equals выполняет в Kotlin ту же функцию, что и ==. Однако между методом equals и оператором == возникает разница в случае сравнения переменных типа Float и Double
- Оператор === в Kotlin используется для сравнения ссылок двух переменных.
HashMap:
- Класс HashMap использует хеш-таблицу для хранения карточки, обеспечивая быстрое время выполнения запросов get() и put() при больших наборах. Класс реализует интерфейс Map (хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. При этом все ключи обязательно должны быть уникальны, а значения могут повторяться.
Что происходит с фрагментами, при повороте экрана?
Состояние фрагментов сохраняется в Bundle.
Как сохранять данные при повороте экрана и что лучше: ViewModel или onSavedInstanceState? :
ViewModel - здесь удобно держать все данные, которые нужны вам для формирования экрана. Они будут жить при поворотах экрана, но умрут, когда приложение будет убито системой.
onSavedInstanceState - здесь нужно хранить тот минимум данных, который понадобится вам для восстановления состояния экрана и данных в ViewModel после экстренного закрытия Activity системой. Это может быть поисковый запрос, ID и т.п.
Соответственно, когда мы достаем данные из savedInstanceState и предлагаем их модели, это может быть в двух случаях:
1) Был обычный поворот экрана. В этом случае ваша модель должна понять, что ей эти данные не нужны, потому что при повороте экрана модель ничего не потеряла. И уж точно модель не должна заново делать запросы в БД, на сервер и т.п.
2) Приложение было убито, и теперь запущено заново. В этом случае модель берет данные из savedInstanceState и использует их, чтобы восстановить свои данные. Например, берет ID и идет в БД за полными данными.
Службы. Service vs ForegroundService:
- Службы запускаются в Ui потоке и работают фоновым процессом, не требуя взаимодействия с пользователем (пример MP3 плеер, или программы для фитнеса).
- Service – это компонент приложения, который используется для выполнения долгих фоновых операций без взаимодействия с пользователем, запускаются в UI потоке.
- Foreground Service – это сервис, о котором пользователь осведомлен. Это достигается с помощью отображения нотификации в статус-баре. Пример foreground сервиса – отображение нотификации при проигрывании музыки в приложении-плеере.
- Процесс в котором работает foreground сервис имеет больший приоритет, чем процесс с background сервисом. В примере с плеером foreground сервис выполняет сразу две функции:
- 1. Говорит системе, что этот процесс убивать не надо, т.к. пользователь взаимодействует с ним;
- 2. Обрабатывает нажатия на кнопки в нотификации.
Что такое inflate?
Процесс "раздувания" (инлэйт) - это сопоставление View с реальными классами (TextView, EditText и тд).
Что такое Bundle?
Bundle – это класс, реализующий ассоциативный массив, т.е. хранящий пары ключ-значение. Имеет get() и put()методы для примитивов, строк и объектов, которые реализуют интерфейсы Parcelable и Serializable.Bundle используется для передачи данных между базовыми компонентами.Возможно ли несколько манифестов в проекте?
Да, возможно, если проект многомодульный.Что такое Delegate в Kotlin?
Делегат — это класс с двумя методами: для получения и присвоения значения свойству.Autoboxing и Unboxing:
Autoboxing - это автоматическое преобразование, которое компилятор Java делает между примитивными типами и их соответствующей оберткой объекта классы. Например, преобразование int в Integer, двойное к Двойной и т. д. Если преобразование идет другим путем, это называется unboxing.
Handler:
Handler может использоваться для планирования выполнения кода в некоторый момент в будущем. Также класс может использоваться для передачи кода, который должен выполняться в другом программном потоке.Data class:
Это класс, которые содержат примитивы, набор полей с какими то данными, не несущий никакой логики.
Какие виды / типы памяти вы знаете?
Память условно имеет две области для хранения данных - стек (stack) и куча (heap).- Стек работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек фрагмент данных будет первым в очереди на вывод из стека. Каждый раз, когда функция объявляет новую переменную, переменная добавляется в стек, а когда эта переменная пропадает из области видимости, она автоматически удаляется из стека. Когда стековая переменная освобождается, эта область памяти становится доступной для других стековых переменных. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока, и у каждой переменной есть максимальный размер, зависящий от типа данных.
- Куча — это хранилище памяти, также расположенное в ОЗУ, которое допускает динамическое выделение памяти. Куча не имеет упорядоченного набора данных, это просто склад для ваших переменных. По завершении приложения все выделенные участки памяти освобождаются. Размер кучи задаётся при запуске приложения, но, в отличие от стека, он ограничен лишь физически, и это позволяет создавать динамические переменные.
В чем особенность отличие Jetpack Compose (JC) от существующего Android - фреймворка?
Главной особенностью Jetpack Compose – декларативному стилю создания UI. Суть подхода заключается в описании интерфейса как совокупности composable-функций (они же виджеты), которые не используют «под капотом» view, а напрямую занимаются отрисовкой на canvas.
Передача данных между фрагментами:
- Фрагменты не могут напрямую взаимодействовать между собой. Для этого надо обращаться к контексту, в качестве которого выступает класс Activity. Для обращения к activity, как правило, создается вложенный интерфейс. В данном случае он называется OnFragmentSendDataListener с одним методом.
- Но чтобы взаимодействовать с другим фрагментом через activity, нам надо прикрепить текущий фрагмент к activity. Для этого в классе фрагмента определен метод onAttach(Context context). В нем происходит установка объекта OnFragmentSendDataListener.
- Но чтобы имитировать взаимодействие между двумя фрагментами, здесь также определен метод setSelectedItem(), который обновляет текст на текстовом поле.
Передача данных из Активити во фрагмент:
- Через Bundle.setArguments(key, value);
- Через данные в методе onCreate активности, а во фрагменте через метод onActivityCreated.
Передача данных из фрагмента в Активность:
Следуя принципам "разграничения ответственности" (объекты должны иметь доступ только к тем свойствам, которые им необходимы), передать данные возможно реализуя интерфейс.
Что такое Looper?
Считайте Looper вспомогательным объектом потока, который управляет им. Он обрабатывает входящие сообщения, а также даёт указание потоку завершиться в нужный момент.Sealed (изолированные) классы:
Изолированные классы в Kotlin являются продолжением enum-классов. Подобные классы удобно создавать если в будущем вам придется создавать объекты, что могут иметь разное количество параметров, разный функционал, но при этом они все будут объединены под одним общим классом.В изолированных классах каждый элемент представляет из себя либо класс данных (data class), либо объект (object).
Inner (вложенные) классы:
Чтобы вложенный класс мог иметь доступ к свойствам и функциям внешнего класса, необходимо определить вложенный класс с ключевым словом inner. Такой класс еще называют внутренним классом (inner class), чтобы отличать от обычных вложенных классов, так как вложенный класс по умолчанию не имеет доступа к полям и функциям внешнего класса.Extension-функции (расширения):
Функции расширения (extension function) позволяют добавить функционал к уже определенным типам. При этом типы могут быть определены где-то в другом месте, например, в стандартной библиотеке.fun Date.isSaturday(): Boolean {
return getDay() == 6
}
button_choose.setOnClickListener {
val now = Date()
val saturday = now.isSaturday()
textview_info.text = "Сегодня суббота? + $saturday"
}
Infix:
Если функция-расширение использует только один аргумент, то можно вызвать функцию через ключевое слово infix.MediatorLiveData:
MediatorLiveData дает возможность собирать данные из нескольких LiveData в один. Это удобно если у вас есть несколько источников из которых вы хотите получать данные. Вы объединяете их в один и подписываетесь только на него.
Что такое MVVM?:
MVVM - это шаблон архитектуры клиентских приложений, который был предложен Джоном Госсманом (John Gossman) как альтернатива шаблонам MVC и MVP при использовании технологии связывания данных (Data Binding). Его концепция заключается в отделении логики представления данных от бизнес-логики путем вынесения её в отдельный класс для более четкого разграничения.Как сохранить данные во фрагменте при перевороте экрана?
У фрагмента есть свойство retainInstance, которое по умолчанию содержит значение false. Это означает, что при поворотах фрагмент не сохраняется, а уничтожается и создается заново вместе с активностью-хостом. Вызов setRetainInstance(true) сохраняет фрагмент, который не уничтожается вместе с активностью, а передается новой активности в неизменном виде.Какие виды реализации MVP вы знаете?
Одна из библиотек для реализации MVP - это библиотека Moxy. С помощью данной библиотеке была модернизирована сама концепция MVP (между View и Presenter затесался ViewState, из за чего сам MVP начал напоминать паттерн MVVM). ViewState отвечает за то, чтобы View всегда выглядела так, как того хочет Presenter.
У Moxy есть несколько весомых преимущества перед другими решениями:
- Presenter не пересоздаётся при пересоздании Activity(это в разы упрощает работу с многопоточьностью)
- Автоматизация полного восстановления того, что видит пользователь при пересоздании Activity(в том числе при динамическом добавлении элементов Android View)
- Возможность из одного Presenter менять сразу несколько View(на практике оказалось чрезвычайно удобно).
IntentService и JobIntentService:
Класс IntentService является подклассом класса Service. Он используется, если надо выполнять какие-то тяжёлые задачи с намерениями, которые могут выполняться асинхронно. Принцип работы этого вида сервиса прост. Он создаёт новый поток для своей работы, затем мониторит все входящие намерения и отправляет их на обработку в этот поток. Далее в коде вы определяете, как обработать Intent. Вам не нужно запускать AsyncTask и управлять тяжёлыми задачами, сервис сам справится. Вы можете отправить данные обратно в приложение через широковещательное сообщение и принять сообщение через широковещательный приёмник.
Иными словами, приложение посылает в сервис данные через метод startService(), в которых передаёт намерения. IntentService принимает эти вызовы, берёт намерения последовательно и отправляет их в очередь на обработку. И далее они поочерёдно обрабатываются в отдельном потоке методом onHandleIntent() по одному за раз. Когда последний Intent из очереди будет обработан, сервис сам завершит свою работу.
Принципиальная разница между IntentService и JobIntentService в том, что JobIntentService не дает сбоев при работе в фоновом режиме.
Lazy:
Инициализируем объект класса UserViewModel так называемым ленивым способом с помощью функции lazy(). Это функция, которая принимает лямбду и возвращает экземпляр класса Lazy<T>, который служит делегатом для реализации ленивого свойства: первый вызов get() запускает лямбда-выражение, переданное lazy() в качестве аргумента, и запоминает полученное значение, а последующие вызовы просто возвращают вычисленное значение. Таким образом, объект UserViewModel инициализируется только при первом вызове, а далее используется уже инициализированный объект.
Extensions:
Если вы заметили, мы обращаемся к экранным компонентам без вызова метода findViewById, прямо по идентификатору. Это происходит благодаря использованию плагина Kotlin Android Extensions — это плагин для Kotlin, который включён в стандартный пакет. Он позволяет восстанавливать view из Activities, Fragments, и Views таким вот простым способом.Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.
Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.
По умолчанию плагин уже интегрирован в модуль благодаря вот такой строчке в файле сборки модуля:
- 2760
- 08 ноября 2020, 13:17
Не пропустите новые записи!
Подпишитесь на цель и следите за ее достижением