Size: a a a

Android Architecture

2017 January 28

AL

Alexandr Lyadinskii in Android Architecture
Или делать минапи 21 и не беспокоиться вдвойне
источник

SD

Sergey D in Android Architecture
Как это не беспокоится я из за этого не разрешаю в проект тащить лишние либы.
источник

AL

Alexandr Lyadinskii in Android Architecture
Dagger что то от гугла(карты аналитика реклама). Саппорт. И вот уже 65к методов
источник

AL

Alexandr Lyadinskii in Android Architecture
А дальше поздно пить Боржоми
источник

DI

Dmitry Ikryanov in Android Architecture
Sergey а proguard?
источник

SD

Sergey D in Android Architecture
Ну так ппогуард только для прод билда
источник

AL

Alexandr Lyadinskii in Android Architecture
Proguard в дебаге лишнее время сборки
источник

DI

Dmitry Ikryanov in Android Architecture
а, дебаг.. ну там да, мин21
источник

AP

Alexey Pushkarev in Android Architecture
Alexandr Lyadinskii
Или делать минапи 21 и не беспокоиться вдвойне
а как тестировщикам тестить на апи ниже 21, да и самому проверять работоспособность ?
источник

AP

Alexey Pushkarev in Android Architecture
я вот так стал делать и иногда приходится понижать чтобы проверить
источник

A

Artur in Android Architecture
Eugene Matsyuk
Ну вот такая ситуация у нас. Есть какой-то бизнес-класс, который, например, может нам вернуть пять видов ошибок. И для каждой ошибки свой текст. Тогда нам нужно 5 методов вьюшки, которые мы будем дергать в каждом случае. Или же нам просто сформировать в презентере нужную строчку и передать Ее во вью одним методом view.onError(String text)?
@InjectViewState
Вы у себя везде строки в презентерах используете? Затем тестируете презентер чрез Robolectric?
источник

EM

Eugene Matsyuk in Android Architecture
Игорь Озеркин
Для этого делайте errorhandler со стратегиями и обрабатывайте ошибки
Мм, кодом можете показать)
источник

А

Андрей in Android Architecture
Alexey Pushkarev
а что вы думаете про mvvm ?
Некоторое время приходилось быть фул-стек девелопером и посать под веб. Так на таких фреймворках как Knockout и Angular познакомился с MVVM подходом. Очень понравилось. Поэтому когда гугл начал делать databinding в андроиде, то очень обрадовался. Даже начал пилить свой пет-проект, чтобы на нем опробовать как mvvm бедет работать на андроиде. К сожалению, все оказалось не так хорошо, как я надеялся.

Из общих проблем с MVP:
1. ЖЦ активити/фрагмента. ВьюМодел должна его переживать. Тут все просто - работают те же приемы, что и для презентера.
2. Андроидовский контекст внутри ВьюМодели. Тут опять же все те же холиварные вопросы что и для презентера.

Собственные проблемы MVVM в андроиде:
1. Навигация. В MVP простой способ навигации - это презентеру дернуть нужный метод у вьюшки. В MVVM, поскольку ВьюМодел о вьюшке вообще ничего не знает, то добавление такой сущности как Роутер/Навигатор становятся просто необходимостью.
2. Невозможно подписаться на изменения конкретных полей ВьюМодели. В чем неудобство:
а) Внутри самой вьюмодели. Допутим у нас есть два поля для ввода текста и кнопка отправки. Кнопка должна быть активной, если поля не пустые. У меня есть bindable свойсто, отвечающее за активность кнопки, но нету возможности сказать андроиду, чтобы он это свойсто перечитывал при изменении содержимого текстовых полей. Вместо этого я в сетерах bindable свойств, отвечающих за содержание текстовых полей должен указывать что поменялись не только они, но и свойство доступности кнопки (методы notifyPropertyChanged(BR.propertyName)).
b) Во вьюшке. Уже не так неудобно как в предыдущем варианте, но все же. Допустим у ВьюМодели есть свойство с текстом ошибки. Когда оно меняется, вьюшка должна показать тост с ее содержимым. Опять же, я не могу подписаться только на изменения ошибки. Я должен подписаться на саму вьюмодел, и мне в слушатель будут приходить все изменения, а я сам уже должен проверять это то свойство, что меня интересует, или нет? (И при уничтожении вьюшки нужно не забывать отписываться, иначе потечет память).
3. Изменения некоторых свойств могут происходить неявно. Сопровождение и тестирование такого кода усложняется. Хотя это уже больше не проблема самого MVVM, а того, как его используют.

После обсуждений у себя в команде, рассмотрений за и против, остановились на связке MVP + DataBinding. И то, с биндингом тоже нужно акуратно. А то у нас, например, есть любители такого на нем наворотить, что код, который можно было бы протестировать толко junit-ом, становится невозможно тестировать без Espresso.
источник

EM

Eugene Matsyuk in Android Architecture
Artur
Вы у себя везде строки в презентерах используете? Затем тестируете презентер чрез Robolectric?
По-разному.
Robolectric для подмены андроидовских классов
источник

AZ

Alexandr Zherebtsov in Android Architecture
Eugene Matsyuk
На самом деле можно поспорить) обычно для почему не хотим андроидовские классы в презентере? Потому что типа не протестировать? Но есть же Robolectric, который решает эту проблему)
А вообще по опыту бывает, что контекст нужен аж в Интеракторе. И чтобы этого избежать надо плюс пять методов, скажем, и усложнённая логика. Оно того стоит?)
А я у себя заметил другое, что когда Context приходит в презентер (пытается придти), то значит презентер начинает заниматься не своим делом. Нужен ли Context презентере вообще чтобы выполнять свои задачи? Скорее всего слой представления будет лучше спроектирован, если будете пататься избежать зависимости от Context в презентере. Даже если тестирование не учитывать.
источник

RS

Roman Sytnyk in Android Architecture
Кто-то пихает контекст в презентер? 0_о

(За чатом не слежу особо)
источник

AZ

Alexandr Zherebtsov in Android Architecture
Roman Sytnyk
Кто-то пихает контекст в презентер? 0_о

(За чатом не слежу особо)
ну а что, часто в презентере есть зависимости на фреймворк, ну иногда это бывает удобно, например текст дефолтный показать какой нибудь getView().showErrorMessage(ContextCompat.getString(context, R.string.default_error));
источник

AZ

Alexandr Zherebtsov in Android Architecture
но я это не пропагандирую, пример просто)
источник

VB

Vitaliy Babichev in Android Architecture
Alexandr Zherebtsov
ну а что, часто в презентере есть зависимости на фреймворк, ну иногда это бывает удобно, например текст дефолтный показать какой нибудь getView().showErrorMessage(ContextCompat.getString(context, R.string.default_error));
Создать enum с ошибками в View =)
источник

VB

Vitaliy Babichev in Android Architecture
Ну или интдеф, кому что
источник