5. Observable
• Drei Events statt einem
• onNext
• onCompleted
• onError
• Es gibt “Hot” und “Cold” Observables
• Variante: Single - für Sequenzen mit einem Element
8. Operatoren
• Erzeugen, kombinieren, transformieren, filtern
• Ergebnis ist ein neues Observable
→ Operatoren können verkettet werden
• Reihenfolge ist entscheidend
23. Dropbox Bildersuche
private fun searchImages(): Observable<List<SearchMatch>> =
Observable
.merge(
(0 until ImagePickerHelpers.supportedExtensions.size).map {
searchImageType(ImagePickerHelpers.supportedExtensions[it])
}
)
.flatMap { Observable.fromIterable(it) }
.groupBy {
val path = it.metadata.pathDisplay
val directoryPath = path.substring(0, path.lastIndexOf("/"))
val directoryName = directoryPath.substring(directoryPath.lastIndexOf("/") + 1)
directoryName
}
private fun searchImageType(extension: String): Observable<List<SearchMatch>> =
Observable.fromCallable {
dropboxClient
.files()
.search("", extension)
.matches
}
24. Dropbox Bildersuche
private fun searchImages(): Observable<List<SearchMatch>> =
Observable
.concatEager(
(0 until ImagePickerHelpers.supportedExtensions.size).map {
searchImageType(ImagePickerHelpers.supportedExtensions[it])
}
)
.flatMap { Observable.fromIterable(it) }
.groupBy {
val path = it.metadata.pathDisplay
val directoryPath = path.substring(0, path.lastIndexOf("/"))
val directoryName = directoryPath.substring(directoryPath.lastIndexOf("/") + 1)
directoryName
}
.take(100)
private fun searchImageType(extension: String): Observable<List<SearchMatch>> =
Observable.fromCallable {
dropboxClient
.files()
.search("", extension)
.matches
}
25. Dropbox Bildersuche
private fun searchImages(): Observable<List<SearchMatch>> =
Observable
.concatEager(
(0 until ImagePickerHelpers.supportedExtensions.size).map {
searchImageType(ImagePickerHelpers.supportedExtensions[it])
}
)
.flatMap { Observable.fromIterable(it) }
.distinct { it.metadata.name }
.groupBy {
val path = it.metadata.pathDisplay
val directoryPath = path.substring(0, path.lastIndexOf("/"))
val directoryName = directoryPath.substring(directoryPath.lastIndexOf("/") + 1)
directoryName
}
private fun searchImageType(extension: String): Observable<List<SearchMatch>> =
Observable.fromCallable {
dropboxClient
.files()
.search("", extension)
.matches
}
26. Dropbox Bildersuche
private fun searchImages(): Observable<List<SearchMatch>> =
Observable
.concatEager(
(0 until ImagePickerHelpers.supportedExtensions.size).map {
searchImageType(ImagePickerHelpers.supportedExtensions[it])
}
)
.flatMap { Observable.fromIterable(it) }
.filter { it.metadata.name.contains("myposter") }
.groupBy {
val path = it.metadata.pathDisplay
val directoryPath = path.substring(0, path.lastIndexOf("/"))
val directoryName = directoryPath.substring(directoryPath.lastIndexOf("/") + 1)
directoryName
}
private fun searchImageType(extension: String): Observable<List<SearchMatch>> =
Observable.fromCallable {
dropboxClient
.files()
.search("", extension)
.matches
}
27. data class CollageModel(
val layouts: ImmutableList<CollageLayout>,
val selectedLayout: CollageLayout,
val selectedFormatGroup: CollageFormatGroup,
val tiles: ImmutableList<CollageTile>,
val texts: ImmutableList<CollageText>,
val rotations: Int,
val outerMargin: Float,
val innerMargin: Float,
val backgroundColor: Int,
⋮
)
28. MVP + ReactiveX
• Model-View-Presenter Pattern
• Model: Repräsentation des Zustands
• View: Darstellung des Zustands
• Presenter: Zustand verändern und View updaten
29. Subjects
• Sind Observer und Observable
• Geben einen Teil der ursprünglichen Daten weiter
• Varianten: Async, Behavior, Publish, Replay
31. MVP + ReactiveX
• Presenter hat ein BehaviorSubject für Model-Objekte
• Bei Eingaben wird ein neues Model-Objekt erzeugt und das
onNext-Event des Subjects ausgelöst
• View beobachtet das Subject und updated das UI bei
onNext-Events