
前几天在伦敦举行了droidcon会议。 诸如Redux,MVI,构建速度优化和Gradle功能之类的时尚话题没有被忽略。 该事件由Chet Haase和Romain Guy关于内存碎片以及Android垃圾收集器版本之间的差异的报告打开,Jake Wharton作了有关Dagger的演示。
在这篇评论中,我想分享我对会议的印象以及这些报告的细节。
我听说过很多关于伦敦droidcon的信息,但是到目前为止,我还没有去参观它,因为它的价格要比柏林droidcon昂贵得多,更不用说莫斯科会议了。 同时,近年来droidcon,Mobius,AppsConf等俄罗斯会议的水平显着提高,我想与国外同行比较气氛,组织水平和报告水平。
但是首先是第一件事。
门票
如果您提前购买车票,则可以以230英镑+增值税的价格购票。 包括增值税在内的最终价格约为700英镑。 与俄罗斯会议的门票相比,这是相当昂贵的,但平均而言,对于欧洲来说,这是一个足够的价格。 一次飞行将花费约3万卢布,但是有一个省钱的机会,因为胜利号正在那里飞行,您可以单程以约6,000卢布的价格购买机票。
食宿
我们距离会场有15分钟的步行路程。 该酒店平均每天约150磅。 实际上,如果您的要求不是很高,那么您可以每天在市中心住20英镑的旅馆。
组织机构在组织方面,会议处于较高水平。 我喜欢网站本身:一个宽敞的交流和道德放松大厅,舒适的听众可以阅读报告。 大厅里有很多公司的摊位,您可以在那儿买笔和T恤。 在第一天晚上,组织者举行了一个聚会。 那里有免费的饮料和音乐,但是我们去了伦敦散步。

报告书我认为日程安排得很好,因为随时都有有趣的报道。 此外,研讨会经常举行。
但是从报告的角度来看,我期望更多。 其中许多没有任何实际的组件,例如,仅是一些API或功能的描述。 莫斯科会议的报道水平至少不低于此水平。 有几项相当不错的相关表演。 接下来,我将写一些对我来说最有趣的东西。
有关报告的更多信息主题演讲-垃圾话:Android上垃圾收集的演变
Chet Haase和Romain Guy,Google会议开始时有一篇关于Android内存模型的非常好的报告。 伙计们告诉了它是如何因版本而变化的,原因是什么。 我不会在这里透露细节,但是我建议您观看
视频 。
模块化-有多难?
Elin Nilsson,Spotify虽然技术性不强,但更具激励性,但这份有趣的报告也不少。 Elin谈到了促使他们考虑将单片应用程序划分为模块的原因,它的难易程度以及从代码量,过程和构建速度方面的考虑。 链接到
报告 。
Android上的Redux
Nish Tahir,柳树我不能说这份报告某种程度上让我对Redux敞开了大门,但我认为作者很好地揭示了这一决定的实质,谈到了问题以及是否值得选择Redux作为主要的架构模式,在这种情况下,它是合理的。
报告链接
现代数据绑定
Yigit Boyar和Jose Alcerreca,Google聆听开发人员自己口中有关Google工具的报告很有趣。 原则上,他们没有说什么新的东西,也没有出现使用数据绑定的愿望,但是感谢您的尝试。
报告链接
深入研究Android Gradle插件
约翰·罗德里格斯(John Rodriguez),Square Cash这份报告是会议上的最后一份报告,我还没有准备好接收有趣且翔实的信息,但是John出来并就Android Gradle Plugin的有趣细微差别做出了一份不错的报告。 我也建议您
查看 。
帮助匕首帮助您
杰克·沃顿(Google)杰克·沃顿(Jack Wharton)发表了很好的报告。 他们与Square一起制作了几个方便的库,供Dagger使用,解决了许多开发人员的问题。
首先,现在很多人关注了构建速度问题。 对于Dagger和ButterKnife来说尤其如此,因为它们使用了注释处理器和kapt。 Square提出了一种解决方案,其中Dagger和ButterKnife实现在反射而不是代码生成上起作用。 这稍微降低了运行时应用程序的速度,但节省了编译时间,而且在开发人员构建的框架内,这是合理的,因为对于最新的Pixel和Samsung型号而言,这几乎是不值得注意的工作。
这是Binder实现在带有反射功能的ButterKnife版本中的外观@NonNull @UiThread public static Unbinder bind(@NonNull Object target, @NonNull View source) { List<Unbinder> unbinders = new ArrayList<>(); Class<?> targetClass = target.getClass(); if ((targetClass.getModifiers() & PRIVATE) != 0) { throw new IllegalArgumentException(targetClass.getName() + " must not be private."); } 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); }
可在此链接找到ButterKnife的库。 Dagger的版本就在这里 。
其次,有时有必要将依赖项注入以XML声明的自定义视图中。 以前,您必须通过set方法注入它们,并在外部将类将其自身附加到视图时(例如,在演示者中)将它们扔给类。 现在有一种简便的方法:可以在所需参数之后立即通过构造函数抛出依赖关系,而自定义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编写的。
图库浏览 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; } }
第三,Square以自己的方式解决了AutoValue解决的问题,即为具有大量构造函数的类创建工厂。 仅此解决方案已最大程度地集成到Dagger逻辑中。
用法示例:
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(); } }
我喜欢这些主题解决方案的实现看起来多么容易。 还建议查看 。
毫无疑问,我从会议报告中学到了一些有趣的东西,与来自不同公司的同事进行了交谈,这是一次国际会议的一大收获,值得与他们进行交流。 这次的好处是去了伦敦。 如果我们谈论报告,则可以更轻松地在线观看报告或参加众多俄罗斯会议之一。