Постановка задачи
Взять из внешнего сервиса список всех Аэропортов мира и по коду Аэропорта получить от внешнего сервиса он-лайн табло с информацией о статусах рейсов. В 100% приложений, которые лежат в google play и реализуют такую функцию, нужно проходить цепочку действий, искать внутри приложения. Я лично, не нашел агрегатор, который позволял бы на первой странице ввести любой Аэропорт и получить его он-лайн табло. Идея и приложение само по себе простое, но это функция которой пользуется любой кто совершает перелет. Доступ к такой информации должен быть мгновенным.
Нашел потрясающий сервис, который открывает много возможности в части разработки под Авиацию. developer.flightstats.com Зарегистрировался получил на месяц бесплатный аккаунт.
Действовал интуитивно, полагаясь на свой опыт разработки в JavaScript. Набросал скетчи экранов в Photoshop. Составил требования к приложению.
Форма «Поиск»
- Приложение должно загружать список всех аэропортов мира в компонент типа «Выпадающий список».
- Дать возможность с помощью фильтра выбирать аэропорт, переключать время UTC/LT(местное время)
Форма «Результат»
- Вывод данных в виде таблицы
- Сортировка по времени Прилет\Вылет
Разработка
Дальше был Я, Google и Android Studio.
Из опыта понимаю что код нужно организовывать. Интуитивно определил структуру проекта. Выделил следующие группы(Models, Stores, Views, Fields, API, Adapters) Двигало мной в этот момент бессознательное, вернее опыт. Дальше начал развлекаться с Layouts. Android Studio очень интуитивный редактор, это одна из причин которая подвигла попробовать написать Android приложение. Если kind of intellij idea – значит все комфортно. Плюс редактор лежит в бесплатном доступе, никаких ограничений, развивается и обновляется регулярно. Layouts сложились на раз два. Ни одного глюка за весь период работы, все на своих местах.
Момент который меня насторожил в самом начале, в 90% источниках, поиск и работа ведется по ID компонента. Обще принято, работа с ID это bad practice, в Android оказалось нормальной практикой. Погуглил, одно из лекарств DataBinding, отличная вещь, позволяет уйти от findViewById. Но, принцип в начальной стадии и еще год назад связь работала в одну сторону. Звучит странно, DataBinding но в одну сторону. Нужно было писать свою реализацию чтобы DataBinding был полноценный. Опираясь на реализации в JS, удивил концепт, который на текущий момент предлагает Data Binding Library(можно увидеть в большинстве случаев в сети), в ViewModel размещается логика по обработке handlers от визуальных компонент, которые в свою очередь могут иметь прямой доступ к данным которые лежат в ViewModel. С виду какой то гибрид контроллера и ViewModel.
Далее пошли вопросы коммуникации, то что нагуглилось с первого раза повергло в шок. Чтобы сделать обычный AJAX запрос нужно было тянуть строк 70 кода. Создавать фоновый процесс и там уже творить магию соединения, а потом через буфер собирать ответ. «Не может быть, чтобы было так сложно!» и продолжил поиск. В одном из результатов попалась статья про Retrofit2. С Retrofit стало все веселее и в целом жить можно в части коммуникаций. Определился с интерфейсами взаимодействия с сервером и начал сопрягать данные с визуальными компонентами.
С фильтром spinner(он же combobox) пришлось повозиться, возможно из-за неопытности. По ходу возникала куча вопросов от конвертации одного типа в другой до как реализован ООП в JAVA, но все элементарно находилось в stack overflow с ответами и примерами, плюс интуиция. В целом все шло как по маслу, кроме некоторых моментов. Чего не ожидал, что получу головную боль с датой. Почему то JAVA(или может быть это у меня так вышло) по defaul выдавала все в UTC.
В целом каких то совсем непреодолимых моментов не было из-за которых возникал полный стопор. Что не понял(зачем это сделали как dafault поведение?!) При изменении ориентации экрана(или конфигурации), ваша View которая присутствует на экране уничтожается и в новом повернутом экране заново пересоздается(фоном идет масштабная работа). Что порождает головную боль если у Вас в классе View(она же «Активность») есть динамические данные, они просто теряются при уничтожении View и с этим что-то надо делать. Дайте эту возможность, но опционально, для тех кто хочет подменять экраны при повороте. Интересно услышать мнение Android разработчика по этому поводу, возможно я не вижу всей картинки в целом.
Awesome
Потрясла производительность интерфейсов при большой нагрузке. Для теста сделал 8 spinner, в каждый забросил 4000 записей(в каждой записи еще набор свойств) и приложение даже не крякнуло. При такой ситуации, JS приложение напряглось бы, и если бы еще нужно было отображать все записи сразу, и иметь доступ работы с ними, то большая вероятность поймать зависание экрана или вообще «Опаньки». Пришлось бы тащить буферизацию вывода или решать как то алгоритмически. Но есть задачи когда нужен весь объем и сразу.
Многопоточность и фоновые процессы, на лету. Что в JS нужно можно делать с помощью webworkers, но там свои трудности, которые при разработке под Android решаются на раз, два. Причем фоном можно тягать действительно весомые объемы. Это огромное value для разработки off line приложений с сложными инженерными расчетами.
Приложение под браузер имеет свой потолок по производительности, если речь идет о высоко нагруженных интерфейсах(вывод одновременно большого объема данных) или когда фоном нужно делать объемные вычисления. Здесь перед Android приложениями снимаю шляпу. Но если Вам нужно делать что-то средне статистическое, то javascript возьмет свое скоростью разработки.
Резюме
Признаю, трудоемко писать под Android и требует в разы больше времени чем написание приложений на JS, но google интенсивно развивает и наращивает платформу. Неделя сидения за книгами и теорией Android разработки скорее всего убило бы идею попробовать сделать Android приложение и не дала бы навыков и опыта полученного за эти 12 часов. Реально столкнуться с проблемами и увидеть мир изнутри, получить первую оценку возможностей Android приложений и в будущем, столкнувшись с задачами трудно реализуемыми в JS, иметь в запасе знания куда можно еще бросить свой взгляд. Практика — быстрый путь к достижению навыков и опыта.
Что получилось: Android-приложение для просмотра он-лайн табло любого аэропорта мира.
Послесловие
При наличие других 12 часов, есть желание развить идею дальше.
Игорь
Комментарии (17)
ipgaero
07.06.2017 04:50Хотелось попробовать кардинально другую платформу и окружение для задач близких на повседневные.
gadfi
07.06.2017 06:08а почему не посмотрели в сторону react native? около 5 лет занимаюсь нативной разработкой под android, но прихожу к мысли что react код приятнее писать, проще поддерживать и вводить новых людей в проект.
ipgaero
07.06.2017 16:57Смысл был не изменить workflow и перейти на android. Хотелось попробовать кардинально другую платформу и сделать выводы. Соприкасаясь темы, было ощущение что самой платформой серьезно стали заниматься только года два назад и причем очень интенсивно. Есть реальный пример что сделал google в части развития браузера chrome, ожидаю что они сделают такой же эволюционный скачок для платформы android. С большой вероятностью можно сказать, что android это широко распространенная реальность на ближайшие лет 10-15. Вот такое мое видение, хотя в текущий момент времени, я на 100% связан с JavaScript.
ipgaero
07.06.2017 17:05PS React native обязательно гляну, получил очень много позитивных отзывов в его сторону, просто руки не дошли.
adasoft
07.06.2017 13:04Теретически интерфейсную часть можно оставить на HTML5, а фоновые задачи реализовать нативно. Есть и готовые плагины для поддержки фоновых задач для Cordova. Но да, остаётся вопрос Native look UI для HTML5 части…
oldschoolgeek
07.06.2017 16:58React Native в том и хорош, что даёт лучшее из двух миров — возможность программировать пользовательский интерфейс в знакомой парадигме React / Redux с очень похожим на HTML5 языком разметки, при этом на выходе получается полностью нативное приложение безо всяких WebView.
firstpasha
07.06.2017 18:10Увидел статью и пришла мысль. Так получилось, что я «frontend» разработки, который от скуки поступил на курс по android разработке в Иннополисе. Может пописать блог об ощущениях с полей (начался он вчера)? Будет интересно такое кому?)
ipgaero
09.06.2017 00:43Если есть идея и желание, надо пробовать! Первые отзывы дадут знать на сколько идея состоятельна.
IgeNiaI
Телефон можно держать как вертикально, так и горизонтально, и довольно часто для этих двух состояний нужна разная разметка, причем иногда не только разные положения элементов, но и бывает, что на одном экране есть некий элемент, которого не должно быть на другом (например, какая-нибудь картинка чисто для дизайнерских целей). Самым простым решением оказалось просто пересоздавать Activity, а с ней и всю разметку. Если вам оно не нужно, добавьте в манифест к вашему Activity строку android:configChanges=«orientation»
Если пересоздание всё же желательно, то есть механизм для сохранения данных. В вашей Activity переопределите метод onSaveInstanceState и в сохраните данные в Bundle, который вы получите в качестве параметра. Потом эти данные можно достать в методе onCreate
ipgaero
Спасибо за информацию
kirillaristov
Как все оказывается просто, и стольких чертыханий у пользователей можно избежать.
Alexko
А еще можно использовать фрагменты и их метод setRetainInstance
IgeNiaI
Тоже вариант, но перед применением желательно понимать что именно оно делает.
setRetainInstance сохраняет сам объект фрагмента, что полезно при поворотах экрана, но зато не спасёт от освобождения памяти системой когда приложение в фоне и системе нужны ресурсы.