moderne android-app - aber wie? · › „fernsehen wie noch nie” ›produkt der exaring ag...
TRANSCRIPT
![Page 1: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/1.jpg)
Moderne Android-App - Aber wie?
Daniel Bälz Karlsruhe, 21.11.2016
![Page 2: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/2.jpg)
“Greetings, Exalted One. Allow me to introduce myself.”
2
Star Wars: Episode VI - Return of the Jedi
![Page 3: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/3.jpg)
› „Fernsehen wie noch nie”› Produkt der EXARING AG
› Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern
› Launch: Oktober 2016
3
waipu.tv
![Page 4: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/4.jpg)
› TV Livestreams
› Zeitversetzte Streams
› Aufnehmen von Sendungen
› Wiedergabe per App und Chromecast (bald: Fire TV)
› App als erweiterte Fernbedienung
› Programmübersicht
› Persönliche Tipps
4
Feature
![Page 5: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/5.jpg)
5
Demo Android-App
![Page 6: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/6.jpg)
“Roads? Where we're going we don't need roads.”
6
Back to the Future
![Page 7: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/7.jpg)
› Gute Grundstruktur bereitstellen› Weiterentwicklung vereinfachen› Wachsende Anforderungen einplanen› Testbarkeit ermöglichen› Trends bei Android einfach integrieren
7
Motivation
![Page 8: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/8.jpg)
8
Überlegungen
Design Pattern Bibliotheken
CI/CD
Architektur
![Page 9: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/9.jpg)
› Android Lifecycle› Activity/Fragment Gottklasse› Abhängigkeiten vom API Level› Kommunikation innerhalb der App› Externe, asynchrone Kommunikation› Testbarkeit (Instrumentation und lokal ausführbar)
9
Herausforderungen
![Page 10: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/10.jpg)
“I see in your eyes the same fear that would take the heart of me”
10
The Lord of the Rings: The Return of the King
![Page 11: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/11.jpg)
› Model: Geschäftslogik (Anbindung Backend)› View: Darstellung (Fragment)› Presenter: Steuerung des Ablaufs
› Umsetzung› Mit Bordmitteln› Definition über Interfaces
11
Model-View-Presenter
![Page 12: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/12.jpg)
12
Model-View-Presenter
Model
PresenterViewDaten für UI
Neue Aktion
AnfrageErgebnis
![Page 13: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/13.jpg)
13
Clean Architecture
Quelle: http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
![Page 14: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/14.jpg)
14
Beispiel Verwendung
![Page 15: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/15.jpg)
15
Beispiel Verwendung
Fragment Presenter Use Case Backend API
ModelModelModel
![Page 16: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/16.jpg)
› Vorteile› Gute Trennung (Separation of Concerns)› Übersichtlichere Klassen› Testbarkeit der einzelnen Komponenten
› Nachteile› Mehraufwand bei der Umsetzung› Mehr Klassen› Lange Aufrufpfade
16
Vor- und Nachteile
![Page 17: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/17.jpg)
„ReactiveX is a library for composing asynchronous and event-based programs by using observable
sequences.”
17
Reactive Extensions
Quelle: http://reactivex.io/intro.html
![Page 18: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/18.jpg)
› Implementiert der Reactive Extensions für Java› Open Source› Android
› RxAndroid: Bindings für Android› RxBinding: UI Widget Bindings
18
RxJava
![Page 19: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/19.jpg)
› Observable› Emittiert Daten› Thread Handling
› Subscriber› Konsumiert Daten
› Operator› Manipuliert Daten
› Subject› Observer und Observable
19
Bestandteile
![Page 20: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/20.jpg)
› Viele Arten Observable zu erzeugen› Verschiedene Subscriber› Sehr (sehr) viele Operatoren› Mehrere Subjects
20
Umfang
![Page 21: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/21.jpg)
Subscriber<Integer> subscriber = new Subscriber<Integer>() { @Override public void onCompleted() { }
@Override public void onError(Throwable e) { }
@Override public void onNext(Integer integer) { }};numberObservable.subscribe(subscriber);
21
Subscriber
![Page 22: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/22.jpg)
Observable<Integer> numberObservable = Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(42); subscriber.onCompleted(); } });
22
Observable
![Page 23: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/23.jpg)
Observable<Integer> numberObservable = Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(42); subscriber.onCompleted(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());
23
Thread Handling
![Page 24: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/24.jpg)
Observable<Integer> numberObservable = Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(42); subscriber.onCompleted(); } }).map(new Func1<Integer, Integer>() { @Override public Integer call(Integer integer) { return integer * 2; } });
24
Operator
![Page 25: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/25.jpg)
PublishSubject<Integer> publishSubject = PublishSubject.create();publishSubject.subscribe(subscriber);publishSubject.onNext(0);publishSubject.onNext(1);publishSubject.subscribe(subscriber2);publishSubject.onNext(2);publishSubject.onNext(3);publishSubject.onCompleted();
BehaviorSubject<Integer> behaviorSubject = BehaviorSubject.create(-1);behaviorSubject.onNext(0);behaviorSubject.onNext(1);behaviorSubject.subscribe(subscriber3);behaviorSubject.onNext(2);behaviorSubject.onNext(3);behaviorSubject.onCompleted();
25
Subject
![Page 26: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/26.jpg)
public Observable<List<Channel>> getChannels() { Observable<List<Channel>> apiCall = authUseCase .getAuthorizationStringAsObservable() .flatMap(new Func1<String, Observable<? extends List<Channel>>>() { @Override public Observable<? extends List<Channel>> call(String auth) { return businessSystemsApi.getChannelData(auth); } }); return authUseCase.loginWhenRequired(apiCall) .doOnNext(new Action1<List<Channel>>() { @Override public void call(List<Channel> channels) { dbHelper.insertChannelList(channels); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());}
26
Beispiel aus waipu.tv
![Page 27: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/27.jpg)
› Vorteile› Thread Handling› Datenmanipulation› Komplexe Szenarien lösbar
› Nachteile› Verwalten der Subscription› Gefahr von Memoryleaks› Lernkurve
27
Vor- und Nachteile
![Page 28: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/28.jpg)
› Bibliothek für Dependency Injection› Single Responsibility› Abhängigkeiten in zentraler Klasse verwaltet› Singleton
› Codegenerierung zur Compile-Zeit› Komponenten und Modulsystem
28
Dagger 2
![Page 29: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/29.jpg)
@Modulepublic class BusinessSystemsModule {
@Provides @Singleton public RecommendationsUseCase provideRecommendationsUseCase( BusinessSystemsApi businessSystemsApi,
AuthUseCase authUseCase) { return new RecommendationsUseCase(businessSystemsApi, authUseCase); }}
29
Module
![Page 30: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/30.jpg)
@Component(modules = {SharedPreferencesModule.class, BusinessSystemsModule.class})public interface AppComponent { void inject(WaipuApplication application); void inject(BaseActivity baseActivity);
RecommendationsUseCase recommendationsUseCase();}
30
Component
![Page 31: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/31.jpg)
@InjectRecommendationsUseCase recommendationsUseCase;
31
Injection
![Page 32: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/32.jpg)
› Vorteile› Klare Struktur der Abhängigkeiten› Einfache Verwendung› Austauschbarkeit für Tests
› Nachteile› Mehr eigene Klassen› Viele generierte Klassen
32
Vor- und Nachteile
![Page 33: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/33.jpg)
› Support Library› Retrofit› Glide› Timber› Butterknife› Joda Time› Stetho
33
Weitere Bibliotheken
![Page 34: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/34.jpg)
“[...] and I show you how deep the rabbit hole goes.”
34
The Matrix
![Page 35: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/35.jpg)
› Scrum› Wissenstransfer
› Kein Inselwissen› Merge Request mit intensivem Review› Diskussionen› Dokumentation
› Kritische Betrachtung des aktuellen Stands› Bereitschaft zur Veränderung
35
Entwicklung
![Page 36: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/36.jpg)
› Gitflow› Gitlab CI
› YAML zur Jobbeschreibung› Docker Images› Testausführung› Upload des Artefakt
› Reporting Crash und Fehler
36
CI/CD
![Page 37: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/37.jpg)
› Initialen Mehraufwand nicht scheuen› Konsequente Umsetzung lohnt sich› Vorhandene Bibliotheken nutzen› Bibliotheken/Abhängigkeiten erzeugen neue Probleme› Automatisiertes Testen immer noch umständlich
37
Fazit
![Page 38: Moderne Android-App - Aber wie? · › „Fernsehen wie noch nie” ›Produkt der EXARING AG ›Android-App: Umsetzung seit Januar 2016 mit 2-5 Entwicklern ›Launch: Oktober 2016](https://reader033.vdocument.in/reader033/viewer/2022042220/5ec67eca0a2d8124256205ce/html5/thumbnails/38.jpg)
Vielen Dank
38