
El otro día en Londres, se celebró la conferencia droidcon. No pasaron por alto temas tan modernos como Redux, MVI, la optimización de la velocidad de construcción y las capacidades de Gradle. El evento fue inaugurado por un informe de Chet Haase y Romain Guy sobre la fragmentación de la memoria y las diferencias entre las versiones de Garbage Collector de Android, y Jake Wharton hizo una presentación sobre Dagger.
En esta revisión, quiero compartir mis impresiones de la conferencia y los detalles de estos informes.
Escuché mucho sobre el droidcon de Londres, pero hasta ahora no he podido visitarlo, ya que resulta mucho más caro que, por ejemplo, el droidcon Berlin, sin mencionar las conferencias de Moscú. Al mismo tiempo, el nivel de las conferencias rusas, como droidcon, Mobius, AppsConf, ha crecido significativamente en los últimos años, y quería comparar la atmósfera, el nivel de organización y los informes con sus homólogos extranjeros.
Pero lo primero es lo primero.
Entradas
Si compra un boleto por adelantado, puede tomarlo por 230 libras + IVA. El precio final fue de aproximadamente 700 libras, incluido el IVA. Es bastante caro en comparación con los boletos para las conferencias rusas, pero en promedio es un precio adecuado para Europa. Un vuelo costará alrededor de 30 mil rublos, pero existe la oportunidad de ahorrar dinero, ya que Victory está volando allí, y puede comprar un boleto por aproximadamente 6,000 rublos por trayecto.
Alojamiento
Vivimos a 15 minutos a pie del lugar. El hotel es promedio, alrededor de 150 libras por día. De hecho, si no eres demasiado exigente, puedes vivir en un hostal en el centro de la ciudad por 20 libras por día.
OrganizacionEn términos de organización, la conferencia tuvo un nivel bastante alto. Me gustó el sitio en sí: una sala espaciosa para la comunicación y la relajación moral, audiencias cómodas en las que se leían los informes. En el pasillo había muchos puestos de varias compañías donde podías llevar un par de bolígrafos y camisetas. En la tarde del primer día, los organizadores hicieron una fiesta. Había bebidas y música gratis, pero salimos a caminar por Londres.

InformesEl cronograma, en mi opinión, fue muy bien elaborado, ya que en cualquier momento hubo informes interesantes. Además, se realizaron talleres constantemente.
Pero por el nivel de informes esperaba más. Muchos de ellos no tenían ningún componente práctico, por ejemplo, solo una descripción de alguna API o funcionalidad. El nivel de informes en las conferencias de Moscú al menos no es más bajo. Hubo varias actuaciones bastante fuertes y relevantes. A continuación, escribiré sobre los que me parecieron más interesantes.
Más sobre informesKeynote - Trash Talk: The Evolution of Garbage Collection en Android
Chet Haase y Romain Guy, GoogleLa conferencia comenzó con un muy buen informe sobre el modelo de memoria en Android. Los chicos contaron cómo cambió de una versión a otra, por qué razones sucedió esto. No divulgaré detalles aquí, pero recomiendo ver el
video .
Modularización: ¿qué tan difícil puede ser?
Elin Nilsson, SpotifyNo del todo técnico, pero más motivador, pero de este informe no menos interesante. Elin habló sobre las razones que los hicieron pensar en dividir la aplicación monolítica en módulos, lo difícil que fue y lo que surgió en términos de la cantidad de código, procesos y velocidad de construcción. Enlace al
informe .
Redux en Android
Nish Tahir, WillowTreeNo puedo decir que este informe de alguna manera me abrió los ojos a Redux, pero, en mi opinión, el autor reveló bien la esencia de esta decisión, habló sobre los problemas y si vale la pena elegir Redux como el patrón arquitectónico principal y en qué casos está justificado.
Informar enlace
Enlace de datos moderno
Yigit Boyar y Jose Alcerreca, GoogleFue interesante escuchar un informe sobre herramientas de Google desde los labios de los propios desarrolladores. En principio, no dijeron nada nuevo, el deseo de usar Data Binding tampoco apareció, pero gracias por el intento.
Informar enlace
Sumérgete profundamente en el complemento Android Gradle
John Rodriguez, Square CashEste informe fue uno de los últimos en la conferencia, y no estaba listo para recibir información interesante e informativa, pero John salió e hizo un informe bueno y bastante duro sobre los matices interesantes de Android Gradle Plugin. También lo recomiendo para
ver .
Ayudando a Dagger a ayudarte
Jake Wharton, GoogleUn buen informe vino de Jack Wharton. Junto con Square, crearon varias bibliotecas útiles para usar con Dagger que resuelven varios problemas de los desarrolladores.
En primer lugar, ahora se presta mucha atención al problema de la velocidad de construcción. Esto es especialmente cierto para Dagger y ButterKnife ya que usan el procesador de anotaciones y kapt. Square presentó una solución en la que las implementaciones de Dagger y ButterKnife funcionan en la reflexión en lugar de la generación de código. Esto reduce ligeramente la velocidad de la aplicación en tiempo de ejecución, pero ahorra tiempo en el tiempo de compilación, y en el marco de las compilaciones de desarrollo está bastante justificado, ya que para los últimos modelos de Pixel y Samsung este es un trabajo apenas notable.
Así es como se ven las implementaciones de Binder en la versión ButterKnife con reflexión@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); }
La biblioteca de ButterKnife se puede encontrar en este enlace. La versión para Dagger está por aquí .
En segundo lugar, a veces es necesario inyectar dependencias en vistas personalizadas que se declaran en XML. Anteriormente, tenía que inyectarlos a través de métodos establecidos y lanzarlos a través de clases desde el exterior, por ejemplo, en un presentador, cuando se adjunta a una vista. Ahora hay una manera conveniente para esto: las dependencias se pueden generar a través del constructor inmediatamente después de los parámetros requeridos, y el LayoutInfater personalizado puede crear una vista con estos constructores complejos.
Cómo se ve en el código:
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 está escrito en 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; } }
En tercer lugar, Square, a su manera, abordó el problema que resuelve AutoValue, a saber, la creación de fábricas para clases con constructores pesados. Solo esta solución está integrada al máximo en la lógica de Dagger.
Ejemplo de uso:
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(); } }
Me gustó lo fácil que parecen las implementaciones de estas soluciones tópicas. También aconsejamos ver .
Sin lugar a dudas, aprendí algo interesante para mí de los informes de la conferencia, hablé con colegas de diferentes compañías, lo cual es una gran ventaja de una conferencia internacional, y vale la pena ir a ellos para establecer contactos. Una ventaja esta vez fue una visita a Londres. Si hablamos de informes, es más fácil verlos en línea o asistir a una de las muchas conferencias rusas.