[Разработка под Android] Борьба за жизни переменных. Или как я попытался упростить жизнь Android разработчикам
Автор
Сообщение
news_bot ®
Стаж: 6 лет 4 месяца
Сообщений: 27286
Была идея. Собрать в одно место группу важных переменных, чтобы вместе они стали чем-то большим. И когда понадобятся, могли использоваться тогда, когда программисту нужны значения не зависящие от жизненных циклов и высвобождения памяти свернутых приложений.
![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/f6c0a6fcd6a56754e345779bedb5de1b.png)
ИдеяИдея появилась из проблемы. Проблема появилась из негодования. Мне было жутко неприятно от мысли, что при повороте экрана приходится проделывать серьезную работу над тем, чтобы сохранить состояние экрана в том виде, каком оно было до поворота.
Но еще больше негодования у меня вызвала новость, что поворот экрана это не единственная причина, которая может мешать мне сохранять состояние в неизменном виде.
Я ранее слышал про то, что система подчищает ресурсы для чего-то, забивая на свернутые приложения, но когда я немного углубился в это, то очень сильно был огорчен. Именно из этого "негодования" у меня появилась проблема. Как мне сделать это красиво и не так болезненно?
И из этой проблемы появилась идея. Идея собрать все, что должно быть независимо от поворота экрана и высвобождения памяти, в одно место, чтобы я в этом месте был уверен на все сто процентов и всегда знал: Все, что я туда положил, там и останется в неизменном виде.
И не хотелось сильно размазывать код этими переменными...Каким образом решить эту задачу? Сразу вспоминаешь решения, которые уже есть: bundle и т.д.Но мне одному все эти решения кажутся неудобными? Мне одному кажется, что они выписываются из общего кода, когда начинаешь с ними работать?И тут я встал перед выбором, либо я делаю принципиально что-то новое, либо я делаю обертку чего-то, что уже придумано. Да такую обертку, чтобы с ней было удобней работать.
После анализа возможностей и моего знакомства с SavedStateHandle я загорелся желанием сделать обертку над ним и все это использовать в MVVM. Так и родилась библиотека которую сейчас Вы увидите.РеализацияНу тут все просто (имхо)Например, мы уже определились со скоупом наших значений, которые мы хотим хранить. Тогда просто создаем класс в котором просто декларируем их и помечаем этот класс аннотацией @UnkillableНапример вот так:
@Unkillable
data class SampleFragmentState(
val testValue: Double,
val testLiveData: MutableLiveData<Double>
) : EmptyState()
Также мы можем там указать и произвольные классы, но только они уже должны быть с Parcelize (Подробней).Таким образом должен выглядить ViewModel. Естественно, библиотека предлагает не только работу с AndroidViewModel, но и просто ViewModel.
class SampleViewModel(
application: Application,
savedStateHandle: SavedStateHandle
) : AndroidStateViewModel(application, savedStateHandle) {
override fun provideState() = createState<UnkillableSampleFragmentState>()
}
UnkillableSampleFragmentState сгенерируется у Вас сразу после запуска билда проекта. Естественно, наша ViewModel должна быть проинициализированна, но не совсем так как обычно. А так, как предлагает Google для использования SavedStateHandle.
activity?.application?.let { application ->
viewModel = ViewModelProvider(this, SavedStateViewModelFactory(application, this))
.get(SampleViewModel::class.java)
}
Это все. Теперь можно использовать по назначению! Просто записываем туда данные и достаем их. Отмечу, что для сохранения класса необходимо делать его @Parcelize (Подробнее тут).Вот таким образом можно воспользоваться библиотекой.
init {
// get values example
Log.d("StateLog", "0 value ${state.testValue}")
Log.d("StateLog", "1 value ${state.testLiveData?.value}")
}
fun onSetDataClicked() {
// set values example
state.testValue = 2.2
state.updateTestLiveDataValue(3.3) // yourLiveData.value = 3.3
state.postUpdateTestLiveDataValue(3.3) // yourLiveData.postValue(3.3)
}
Таким образом, мы защищаемся от подчистки приложения из памяти операционной системой.ИтогЦель данной библиотеки упростить разработку и разгрузить разработчика от написания кода, при условии, что он работает с сохранением состояния приложения. Также удалось очистить код от всех этих переменных, которые необходимо сохранить. К тому же теперь они логически отделены от общей массы и не засоряют код, что выглядит довольно приятно. Однако пока сейчас она работает только в MVVM от гугла.
GitHub
===========
Источник:
habr.com
===========
Похожие новости:
- [Информационная безопасность, Программирование, Разработка под Android] Android — запрещенные приемы
- [Разработка мобильных приложений, Разработка под Android] Материалы митапа для андроид-инженеров: поиск проблем сборки, защита от них и работа с Gradle
- [Разработка мобильных приложений, Функциональное программирование, Карьера в IT-индустрии, Конференции] Этот поезд в окне: анонс TechTrain 2021 Spring
- [Разработка под e-commerce, Брендинг, Бизнес-модели, Будущее здесь, IT-компании] Как строить процессы в компании, чтобы ваши клиенты были с вами навсегда
- [Системное администрирование, Программирование, Git, Разработка под Linux, DevOps] DevOps: автоматизация инфраструктуры на примере Terraform, docker, bash, prometheus exporters, Gitlab и WireGuard
- [Веб-дизайн, Разработка веб-сайтов, Интерфейсы, Usability, Дизайн] Метод Content Brick. Как создать структуру веб-сайта быстрее и проще чем это было раньше? (перевод)
- [Разработка веб-сайтов, Гаджеты, Старое железо, Лайфхаки для гиков] Вторая жизнь пыльного Андроида
- [Open source, Сетевые технологии, Mesh-сети, Разработка систем связи] Yggdrasil Network: Заря бытовых меш-сетей, или Интернет будущего
- [Разработка под Arduino, Производство и разработка электроники, DIY или Сделай сам] Маяк, ночник и конструктор для вашего ребенка (50 деталей, 3D печать)
- [*nix, Разработка под Linux, Интернет вещей, DIY или Сделай сам] Подключаем дисплей SPI LCD ILI9341 к одноплатному компьютеру Banana Pi BPI-M64 или любому другому на ОС Armbian
Теги для поиска: #_razrabotka_pod_android (Разработка под Android), #_android, #_mvvm, #_savedstatehandle, #_bundle, #_zhiznennyj_tsikl (Жизненный цикл), #_biblioteka (Библиотека), #_library, #_razrabotka (Разработка), #_razrabotka_pod_android (
Разработка под Android
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 05-Июл 11:15
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 4 месяца |
|
Была идея. Собрать в одно место группу важных переменных, чтобы вместе они стали чем-то большим. И когда понадобятся, могли использоваться тогда, когда программисту нужны значения не зависящие от жизненных циклов и высвобождения памяти свернутых приложений.
![]() ИдеяИдея появилась из проблемы. Проблема появилась из негодования. Мне было жутко неприятно от мысли, что при повороте экрана приходится проделывать серьезную работу над тем, чтобы сохранить состояние экрана в том виде, каком оно было до поворота. Но еще больше негодования у меня вызвала новость, что поворот экрана это не единственная причина, которая может мешать мне сохранять состояние в неизменном виде. Я ранее слышал про то, что система подчищает ресурсы для чего-то, забивая на свернутые приложения, но когда я немного углубился в это, то очень сильно был огорчен. Именно из этого "негодования" у меня появилась проблема. Как мне сделать это красиво и не так болезненно? И из этой проблемы появилась идея. Идея собрать все, что должно быть независимо от поворота экрана и высвобождения памяти, в одно место, чтобы я в этом месте был уверен на все сто процентов и всегда знал: Все, что я туда положил, там и останется в неизменном виде. И не хотелось сильно размазывать код этими переменными...Каким образом решить эту задачу? Сразу вспоминаешь решения, которые уже есть: bundle и т.д.Но мне одному все эти решения кажутся неудобными? Мне одному кажется, что они выписываются из общего кода, когда начинаешь с ними работать?И тут я встал перед выбором, либо я делаю принципиально что-то новое, либо я делаю обертку чего-то, что уже придумано. Да такую обертку, чтобы с ней было удобней работать. После анализа возможностей и моего знакомства с SavedStateHandle я загорелся желанием сделать обертку над ним и все это использовать в MVVM. Так и родилась библиотека которую сейчас Вы увидите.РеализацияНу тут все просто (имхо)Например, мы уже определились со скоупом наших значений, которые мы хотим хранить. Тогда просто создаем класс в котором просто декларируем их и помечаем этот класс аннотацией @UnkillableНапример вот так: @Unkillable
data class SampleFragmentState( val testValue: Double, val testLiveData: MutableLiveData<Double> ) : EmptyState() class SampleViewModel(
application: Application, savedStateHandle: SavedStateHandle ) : AndroidStateViewModel(application, savedStateHandle) { override fun provideState() = createState<UnkillableSampleFragmentState>() } activity?.application?.let { application ->
viewModel = ViewModelProvider(this, SavedStateViewModelFactory(application, this)) .get(SampleViewModel::class.java) } init {
// get values example Log.d("StateLog", "0 value ${state.testValue}") Log.d("StateLog", "1 value ${state.testLiveData?.value}") } fun onSetDataClicked() { // set values example state.testValue = 2.2 state.updateTestLiveDataValue(3.3) // yourLiveData.value = 3.3 state.postUpdateTestLiveDataValue(3.3) // yourLiveData.postValue(3.3) } GitHub =========== Источник: habr.com =========== Похожие новости:
Разработка под Android ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 05-Июл 11:15
Часовой пояс: UTC + 5