Главная » Хабрахабр » Droidcon London. Как это было

Droidcon London. Как это было

Её не обошли стороной такие модные темы, как Redux, MVI, оптимизация скорости сборки и возможности Gradle. На днях в Лондоне прошла конференция droidcon. Открывал мероприятие доклад Чета Хаазе (Chet Haase) и Ромена Ги (Romain Guy) про фрагментацию памяти и отличия Garbage Collector между версиями Android, а Джейк Уортон (Jake Wharton) выступил с презентацией про Dagger.

В этом обзоре я хочу поделиться своими впечатлениями от конференции и деталями этих докладов.

В тоже время уровень российских конференций, таких как droidcon, Mobius, AppsConf, в последние годы сильно вырос, и мне хотелось сравнить атмосферу, уровень организации и докладов с зарубежными аналогами.
Я много слышал о лондонской droidcon, но до сих пор не удавалось её посетить, так как она выходит значительно дороже, чем, например, droidcon Berlin, не говоря уже о московских конференциях.

Но обо всем по порядку.

Билеты

Окончательная цена была на них около 700 фунтов, включая VAT. Если покупать билет заранее, то можно взять его и за 230 фунтов + VAT. Перелёт обойдётся примерно в 30 тысяч рублей, но есть возможность сэкономить, так как сейчас туда летает «Победа», и можно купить билет приблизительно за 6000 рублей в одну сторону. Довольно дорого, если сравнивать с билетами на российские конференции, но в среднем для Европы это адекватная цена.

Проживание

Отель среднего уровня, около 150 фунтов в день. Жили мы в 15 минутах ходьбы от места проведения. На самом деле, если вы не слишком требовательны, то можно жить и в каком-нибудь хостеле в центре города за 20 фунтов в день.

Организация

Понравилась и сама площадка: просторный холл для общения и морального отдыха, комфортные аудитории, в которых читались доклады. В плане организации конференция была на достаточно высоком уровне. Вечером первого дня организаторы устраивали вечеринку. В холле было много стендов различных компаний, где можно было взять пару ручек и футболок. Были бесплатные напитки и музыка, мы же пошли гулять по Лондону.

Доклады

К тому же постоянно проходили воркшопы. Расписание, на мой взгляд, было составлено очень хорошо, так как в любое время находились интересные доклады.

Многие из них были без какой-либо практической составляющей, например, просто описание какого-то API или функционала. А вот от уровня докладов я ожидал большего. Было несколько довольно сильных и актуальных выступлений. Уровень докладов на московских конференциях как минимум не ниже. Далее я напишу о тех, которые мне показались наиболее интересными.

Подробнее о докладах

Ребята рассказали, как она изменялась от версии к версии, по каким причинам это происходило. Keynote — Trash Talk: The Evolution of Garbage Collection on Android
Чет Хаазе и Ромен Ги (Chet Haase and Romain Guy), Google

Началась конференция с очень хорошего доклада про модель памяти в Android. Не буду здесь раскрывать детали, но рекомендую к просмотру видео.

Элин рассказала о причинах, которые заставили их задуматься о разделении монолитного приложения на модули, как тяжело оно проходило и что из этого вышло в плане количества кода, процессов и скорости сборки. Modularization — How Hard Can It Be?
Элин Нильсон (Elin Nilsson), Spotify

Не совсем технический, а больше мотивационный, но от этого не менее интересный доклад. Ссылка на доклад.

Ссылка на доклад Redux on Android
Ниш Тахир (Nish Tahir), WillowTree

Не скажу, что этот доклад как-то открыл глаза на Redux, но, по-моему, автор хорошо раскрыл суть этого решения, рассказал о проблемах и о том, стоит ли выбирать Redux как основной архитектурный паттерн и в каких случаях это оправданно.

В принципе, ничего нового они не сказали, желания использовать Data Binding тоже не появилось, но за попытку спасибо. Modern Data Binding
Йигит Бойар и Хосе Альсерека (Yigit Boyar and Jose Alcerreca), Google

Интересно было послушать доклад про инструменты от Google из уст самих разработчиков. Ссылка на доклад

Его тоже рекомендую к просмотру. Deep Dive into the Android Gradle Plugin
Джон Родригес (John Rodriguez), Square Cash

Этот доклад был одним из последних на конференции, и я уже был не готов воспринимать интересную и познавательную информацию, но тут вышел Джон и сделал хороший и довольно хардкорный доклад про интересные нюансы Android Gradle Plugin.

Вместе со Square они сделали несколько удобных библиотек для использования с Dagger, которые решают ряд проблем разработчиков.
Helping Dagger Help You
Джейк Уортон (Jake Wharton), Google

Хороший доклад получился у Джека Уортона.

Для Dagger и ButterKnife это особенно актуально, так как они используют annotation processor и kapt. Вo-первых, сейчас много внимания уделяется проблеме скорости сборки. Это немного уменьшает скорость приложения runtime, но зато экономится время на compile time, и в рамках dev-билдов это вполне оправданно, так как для последних моделей Pixel и Samsung это едва ощутимая работа. Square презентовали решение, при котором реализации Dagger и ButterKnife работают на рефлексии вместо кодогенерации.

Так выглядят реализации Binder в версии ButterKnife с рефлексией

@NonNull @UiThread
public static Unbinder bind(@NonNull Object target, @NonNull View source) while (true) { for (Field field : targetClass.getDeclaredFields()) { int unbinderStartingSize = unbinders.size(); Unbinder unbinder; unbinder = parseBindView(target, field, source); if (unbinder != null) unbinders.add(unbinder); unbinder = parseBindViews(target, field, source); if (unbinder != null) unbinders.add(unbinder); unbinder = parseBindDrawable(target, field, source); if (unbinder != null) unbinders.add(unbinder); unbinder = parseBindString(target, field, source); if (unbinder != null) unbinders.add(unbinder); ... } for (Method method : targetClass.getDeclaredMethods()) { Unbinder unbinder; unbinder = parseOnCheckedChanged(target, method, source); if (unbinder != null) unbinders.add(unbinder); unbinder = parseOnClick(target, method, source); if (unbinder != null) unbinders.add(unbinder); ... } targetClass = targetClass.getSuperclass(); } return new CompositeUnbinder(unbinders);
}

Версию для Dagger где-то здесь. Библиотеку для ButterKnife можно взять по этой ссылке.

Раньше приходилось инжектить их через set-методы ипрокидывать через классы извне, например, в презентере, когда он аттачится к вью. Во-вторых, иногда появляется необходимость инжектить зависимости в кастомные вью, которые объявлены в XML. Сейчас для этого есть удобный способ: зависимости можно прокидывать через конструктор сразу за обязательными параметрами, а кастомный LayoutInfater умеет создавать вью с этими сложными конструкторами.

Как это выглядит в коде:

MainActivity.java

public final class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainComponent component = DaggerMainActivity_MainComponent.create(); InflationInjectFactory factory = component.getInjectFactory(); getLayoutInflater().setFactory(factory); setContentView(R.layout.main_activity); GalleryPresenter presenter = component.getGalleryPresenter(); GalleryView view = findViewById(R.id.gallery); presenter.attach(view); } @Component(modules = ViewModule.class) interface MainComponent { InflationInjectFactory getInjectFactory(); GalleryPresenter getGalleryPresenter(); }
}

GalleryView прописывается в xml.

GalleryView

public final class GalleryView extends LinearLayout { private final ViewUpdater mViewUpdater; @InflationInject public GalleryView(@Assisted Context context, @Assisted AttributeSet attrs, ViewUpdater viewUpdater) { super(context, attrs); mViewUpdater = viewUpdater; }
}

Только это решение максимально интегрировано в логику Dagger. В-третьих, в Square по-своему подошли к проблеме, которую решает AutoValue, а именно к созданию фабрик для классов с тяжелыми конструкторами.

Пример использования:

UserPresenter.java

public final class UserPresenter { private final LoadUserInteractor mLoadUserInteractor; private final String mUserId; @AssistedInject UserPresenter(@Assisted LoadUserInteractor loadUserInteractor, @Exclamation String userid) { mLoadUserInteractor = loadUserInteractor; mUserId = userid; } @AssistedInject.Factory public interface Factory { UserPresenter create(String greeting); } ...
}

UserActivity.java

public final class UserActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_view); UserPresenter.Factory factory = DaggerUserActivity_ UserComponent.create().getUserPresenterFctory(); UserPresenter presenter = factory.create(getIntent().getStringExtra("user_id")); presenter.attach(); ... } @Component(modules = UserModule.class) interface UserComponent { UserPresenter.Factory getUserPresenterFctory(); }
}

Тоже советую к просмотру. Мне понравилось, как легко выглядят реализации этих злободневных решений.

В качестве бонуса в этот раз было и посещение Лондона. Несомненно, я почерпнул что-то интересное для себя из докладов конференции, пообщался с коллегами из разных компаний, что является большим плюсом именно международной конференции, и именно ради нетворкинга стоит ехать на них. Если говорить о докладах, то проще посмотреть их онлайн или посетить одну из многочисленных российских конференций.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[Из песочницы] Контроллер, полегче! Выносим код в UIView

У вас большой UIViewController? У многих да. С одной стороны, в нём работа с данными, с другой — с интерфейсом. Они решают проблему потока данных, но не отвечают на вопрос как работать с интерфейсом: в одном месте остается создание элементов, лейаут, ...

Нужно больше разных Blur-ов

Размытие изображение посредством фильтра Gaussian Blur широко используется в самых разных задачах. Но иногда хочется чуть большего разнообразия, чем просто один фильтр на все случаи жизни, в котором регулировке поддаётся только один параметр — его размер. В этой статье мы ...