Недавно попробовал сделать нативное приложение по Android 4 на Kotlin.
В принципе, всё получилось и даже вышло скучнее чем ожидал. 95% времени заняло не ковыряние самого Kotlin - он-то оказался на редкость удобным и, по сравнению с разработкой на Java, - просто сверхскоростным. Производительность проца и памяти тоже не стала особой проблемой, как я ожидал (хотя приложение внутри юзало рекурсивный обход с отсечением, что довольно нагружало его).
И всё же шероховатости нашлись, само собой.
Относительным неудобством стало использование библиотеки ktor для сетевых запросов. Почему-то под отладчиком сетевые запросы её с использованием нативного движка Android тормозят до 7-10с, против 1-2 в случае без отладчика. При этом, как выяснилось, тормозила даже не сеть, а разбор JSON и его десериализация в объекты.
Сама десериализация внутри ktor дала немного проблем - оказалось, чтобы считать с сервера не объект а массив, надо писать отдельный сериализатор (абстрактная сущность которая кодирует объект в JSON и обратно) в объект, который разворачивается в JSON в массив, иначе использовать его в request<T>, который получает ответ с сервера в виде объекта нельзя. К слову, если парсить самому результат запроса, считав его в строку, проблем не будет.
Кроме того, по-любому нужно чтобы сервер при этом отдавал Content-type: text/json, иначе сериализация провалится. Мелочь, а неудобно. К тому же, нашлось это где-то в issues проекта, хотя казалось бы - напишите в документации, но нет, вместо этого там гора не самых внятных примеров.
Ещё когда я попытался отправить в теле POST-запроса json nginx оказался принимать его и радостно сыпал ошибкой 400. Судя по всему, что-то пошло с заголовками не так. Плюнул, переделал взаимодействие на multipart/form-data, передав json в параметре - сработало без особых проблем. Возможно, я что-то делал всё же не так, подозреваю что дело было в content-type запроса (не ответа!), где передавалось application/json по умолчанию, но разбираться уже не стал.
Что же касается Android, тут ничего не изменилось, ибо, несмотря на то, что Android Studio любезно выводит превью интерфейса, как есть, и я выбирал ровно ту модель экрана, что у меня на телефоне, реально телефон показывал совсем другие вещи. Разметка разъезжалась, кнопки пропадали, словом - бардак и анархия. Что грустно, не появилось никакого удобного объяснения тому, как считаются размеры ни в одном прочитанном мануале. Походу единственное место где это есть - исходники самого Android. А в остальном эта XML-разметка как была похожа на кривой костыльный CSS так и осталась. Искренне надеюсь, что Flutter убьёт вот это всё и станет получше. В итоге большую часть времени, мне пришлось решать проблемы не уровня "почему не работает", а "почему не отображается" и "отображается не так", что до ужаса напомнило ранний Web (да и современный, что там скрывать, тоже иногда бывает).
Для разнообразия поставлю этому всему оценку:
Kotlin: 10/10
Android Studio: 10/10
ktor: 8/10 (оно юзабельно но смотри выше)
Разработка интерфейсов под Android на XML: анус/10
В принципе, всё получилось и даже вышло скучнее чем ожидал. 95% времени заняло не ковыряние самого Kotlin - он-то оказался на редкость удобным и, по сравнению с разработкой на Java, - просто сверхскоростным. Производительность проца и памяти тоже не стала особой проблемой, как я ожидал (хотя приложение внутри юзало рекурсивный обход с отсечением, что довольно нагружало его).
И всё же шероховатости нашлись, само собой.
Относительным неудобством стало использование библиотеки ktor для сетевых запросов. Почему-то под отладчиком сетевые запросы её с использованием нативного движка Android тормозят до 7-10с, против 1-2 в случае без отладчика. При этом, как выяснилось, тормозила даже не сеть, а разбор JSON и его десериализация в объекты.
Сама десериализация внутри ktor дала немного проблем - оказалось, чтобы считать с сервера не объект а массив, надо писать отдельный сериализатор (абстрактная сущность которая кодирует объект в JSON и обратно) в объект, который разворачивается в JSON в массив, иначе использовать его в request<T>, который получает ответ с сервера в виде объекта нельзя. К слову, если парсить самому результат запроса, считав его в строку, проблем не будет.
Кроме того, по-любому нужно чтобы сервер при этом отдавал Content-type: text/json, иначе сериализация провалится. Мелочь, а неудобно. К тому же, нашлось это где-то в issues проекта, хотя казалось бы - напишите в документации, но нет, вместо этого там гора не самых внятных примеров.
Ещё когда я попытался отправить в теле POST-запроса json nginx оказался принимать его и радостно сыпал ошибкой 400. Судя по всему, что-то пошло с заголовками не так. Плюнул, переделал взаимодействие на multipart/form-data, передав json в параметре - сработало без особых проблем. Возможно, я что-то делал всё же не так, подозреваю что дело было в content-type запроса (не ответа!), где передавалось application/json по умолчанию, но разбираться уже не стал.
Что же касается Android, тут ничего не изменилось, ибо, несмотря на то, что Android Studio любезно выводит превью интерфейса, как есть, и я выбирал ровно ту модель экрана, что у меня на телефоне, реально телефон показывал совсем другие вещи. Разметка разъезжалась, кнопки пропадали, словом - бардак и анархия. Что грустно, не появилось никакого удобного объяснения тому, как считаются размеры ни в одном прочитанном мануале. Походу единственное место где это есть - исходники самого Android. А в остальном эта XML-разметка как была похожа на кривой костыльный CSS так и осталась. Искренне надеюсь, что Flutter убьёт вот это всё и станет получше. В итоге большую часть времени, мне пришлось решать проблемы не уровня "почему не работает", а "почему не отображается" и "отображается не так", что до ужаса напомнило ранний Web (да и современный, что там скрывать, тоже иногда бывает).
Для разнообразия поставлю этому всему оценку:
Kotlin: 10/10
Android Studio: 10/10
ktor: 8/10 (оно юзабельно но смотри выше)
Разработка интерфейсов под Android на XML: анус/10
Комментариев нет:
Отправить комментарий