
Neulich fand in London die Droidcon-Konferenz statt. Modische Themen wie Redux, MVI, Optimierung der Build-Geschwindigkeit und Gradle-Funktionen gingen nicht vorbei. Die Veranstaltung wurde durch einen Bericht von Chet Haase und Romain Guy über die Speicherfragmentierung und die Unterschiede zwischen den Garbage Collector-Versionen von Android eröffnet, und Jake Wharton hielt eine Präsentation über Dagger.
In dieser Rezension möchte ich meine Eindrücke von der Konferenz und die Details dieser Berichte teilen.
Ich habe viel über die Londoner Droidcon gehört, konnte sie aber bisher nicht besuchen, da sie viel teurer ist als beispielsweise die Droidcon Berlin, ganz zu schweigen von den Moskauer Konferenzen. Gleichzeitig ist das Niveau russischer Konferenzen wie Droidcon, Mobius und AppsConf in den letzten Jahren erheblich gestiegen, und ich wollte die Atmosphäre, das Organisationsniveau und die Berichte mit ausländischen Kollegen vergleichen.
Aber das Wichtigste zuerst.
Tickets
Wenn Sie ein Ticket im Voraus kaufen, können Sie es für 230 Pfund + MwSt. Nehmen. Der Endpreis betrug ca. 700 Pfund inklusive Mehrwertsteuer. Es ist im Vergleich zu Tickets für russische Konferenzen ziemlich teuer, aber im Durchschnitt ein angemessener Preis für Europa. Ein Flug kostet ungefähr 30.000 Rubel, aber es besteht die Möglichkeit, Geld zu sparen, da Victory dorthin fliegt und Sie ein Ticket für ungefähr 6.000 Rubel in eine Richtung kaufen können.
Unterkunft
Wir lebten 15 Minuten zu Fuß vom Veranstaltungsort entfernt. Das Hotel ist durchschnittlich, etwa 150 Pfund pro Tag. In der Tat, wenn Sie nicht zu anspruchsvoll sind, dann können Sie in einem Hostel in der Innenstadt für 20 Pfund pro Tag leben.
OrganisationIn Bezug auf die Organisation war die Konferenz auf einem ziemlich hohen Niveau. Ich mochte die Seite selbst: einen geräumigen Saal für Kommunikation und moralische Entspannung, ein angenehmes Publikum, in dem Berichte gelesen wurden. In der Halle gab es viele Stände verschiedener Firmen, an denen man Stifte und T-Shirts mitnehmen konnte. Am Abend des ersten Tages hatten die Organisatoren eine Party. Es gab kostenlose Getränke und Musik, aber wir gingen durch London spazieren.

BerichteDer Zeitplan war meiner Meinung nach sehr gut ausgearbeitet, da es zu jeder Zeit interessante Berichte gab. Darüber hinaus fanden ständig Workshops statt.
Aber von der Ebene der Berichte habe ich mehr erwartet. Viele von ihnen hatten keine praktische Komponente, zum Beispiel nur eine Beschreibung einer API oder Funktionalität. Die Anzahl der Berichte auf Moskauer Konferenzen ist zumindest nicht niedriger. Es gab mehrere ziemlich starke und relevante Auftritte. Als nächstes werde ich über diejenigen schreiben, die mir am interessantesten erschienen.
Mehr zu BerichtenKeynote - Trash Talk: Die Evolution der Garbage Collection auf Android
Chet Haase und Romain Guy, GoogleDie Konferenz begann mit einem sehr guten Bericht über das Speichermodell in Android. Die Jungs erzählten, wie es sich von Version zu Version geändert hat, aus welchen Gründen dies passiert ist. Ich werde hier keine Details veröffentlichen, aber ich empfehle, das
Video anzuschauen.
Modularisierung - wie schwer kann es sein?
Elin Nilsson, SpotifyNicht ganz technisch, aber motivierender, aber aus diesem nicht weniger interessanten Bericht. Elin sprach über die Gründe, aus denen sie darüber nachdachten, die monolithische Anwendung in Module zu unterteilen, wie schwierig es war und was daraus in Bezug auf Code, Prozesse und Erstellungsgeschwindigkeit wurde. Link zum
Bericht .
Redux auf Android
Nish Tahir, WillowTreeIch kann nicht sagen, dass dieser Bericht meine Augen für Redux geöffnet hat, aber meiner Meinung nach hat der Autor das Wesentliche dieser Entscheidung gut offenbart, über die Probleme gesprochen und darüber, ob es sich lohnt, Redux als Hauptarchitekturmuster zu wählen, und in welchen Fällen dies gerechtfertigt ist. Link melden
Moderne Datenbindung
Yigit Boyar und Jose Alcerreca, GoogleEs war interessant, einen Bericht über Tools von Google von den Lippen der Entwickler selbst zu hören. Im Prinzip sagten sie nichts Neues, der Wunsch, Datenbindung zu verwenden, trat ebenfalls nicht auf, aber danke für den Versuch. Link melden
Tauchen Sie ein in das Android Gradle Plugin
John Rodriguez, Square CashDieser Bericht war einer der letzten auf der Konferenz, und ich war nicht bereit, interessante und informative Informationen wahrzunehmen, aber John kam heraus und machte einen guten und ziemlich harten Bericht über die interessanten Nuancen des Android Gradle Plugins. Ich empfehle es auch zum
Betrachten .
Hilfe Dolch helfen Ihnen
Jake Wharton, GoogleEin guter Bericht kam von Jack Wharton. Zusammen mit Square erstellten sie mehrere praktische Bibliotheken zur Verwendung mit Dagger, die eine Reihe von Entwicklerproblemen lösen.
Erstens wird jetzt dem Problem der Build-Geschwindigkeit viel Aufmerksamkeit geschenkt. Dies gilt insbesondere für Dagger und ButterKnife, da sie den Anmerkungsprozessor und kapt verwenden. Square präsentierte eine Lösung, bei der Dagger- und ButterKnife-Implementierungen auf Reflexion anstatt auf Codegenerierung basieren. Dies verringert die Geschwindigkeit der Laufzeitanwendung geringfügig, spart jedoch Zeit beim Kompilieren und ist im Rahmen von Entwickler-Builds durchaus gerechtfertigt, da dies für die neuesten Pixel- und Samsung-Modelle kaum spürbar ist.
So sehen die Binder-Implementierungen in der ButterKnife-Version mit Reflexion aus@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); }
Die Bibliothek für ButterKnife finden Sie unter diesem Link. Die Version für Dagger gibt es hier .
Zweitens ist es manchmal erforderlich, Abhängigkeiten in benutzerdefinierte Ansichten einzufügen, die in XML deklariert sind. Zuvor mussten Sie sie mit festgelegten Methoden injizieren und von außen durch Klassen werfen, z. B. in einem Präsentator, wenn dieser sich an eine Ansicht anfügt. Hierfür gibt es jetzt eine bequeme Möglichkeit: Abhängigkeiten können unmittelbar nach den erforderlichen Parametern durch den Konstruktor geworfen werden, und der benutzerdefinierte LayoutInfater kann mit diesen komplexen Konstruktoren eine Ansicht erstellen.
Wie es im Code aussieht:
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 ist in XML geschrieben.
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; } }
Drittens näherte sich Square auf seine Weise dem Problem, das AutoValue löst, nämlich der Schaffung von Fabriken für Klassen mit schweren Konstruktoren. Nur diese Lösung ist maximal in die Dolchlogik integriert.
Anwendungsbeispiel:
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(); } }
Mir hat gefallen, wie einfach die Implementierung dieser aktuellen Lösungen aussieht. Auch empfehlen zu sehen .
Zweifellos habe ich aus den Konferenzberichten etwas Interessantes für mich gelernt, mit Kollegen aus verschiedenen Unternehmen gesprochen, was ein großes Plus einer internationalen Konferenz ist, und es lohnt sich, zum Networking zu ihnen zu gehen. Ein Bonus war diesmal ein Besuch in London. Wenn wir über Berichte sprechen, ist es einfacher, sie online anzusehen oder an einer der vielen russischen Konferenzen teilzunehmen.