J'attire votre attention sur une traduction de l' article original de Mike Nakhimovich

Il était une fois, je travaillais au New York Times et créais une bibliothèque appelée Store
, qui était "la bibliothèque Java pour un chargement de données facile et réactif". Nous avons créé le magasin à l'aide de RxJava
modèles issus de l'implémentation du cache de la goyave . Les utilisateurs d'applications d'aujourd'hui s'attendent à ce que les mises à jour des données se produisent dans l'interface utilisateur sans avoir à faire des choses comme tirer pour actualiserpour actualiser les données ou passer d'un écran à l'autre. L'interface réactive m'a fait réfléchir à la façon dont nous pouvons avoir des entrepôts de données déclaratifs avec des API simples qui résument des fonctions complexes comme la limitation multitâche et la mise en cache de disque, qui sont nécessaires dans les applications mobiles modernes. Au cours de ses trois années de fonctionnement, Store compte 45 contributeurs et plus de 3 500 étoiles GitHub. À partir de maintenant, je suis heureux d'annoncer que Dropbox se chargera du développement actif de la boutique et le publiera entièrement sur Kotlin avec le support de Coroutines
et Flow
. Et maintenant Store 4
, c'est l'occasion de tirer parti de ce que nous avons appris en repensant l'API et les besoins actuels de l'écosystème Android.
Android . . , , Google. , Android. Android Jetpack
:

, Android Jetpack :

https://developer.android.com/jetpack/docs/guide
- : , AndroidX , Lifecycle Scopes . , view- .
- View Model Live Data: , , ( , !).
- Room: SQLite, ORM RxJava .
- Remote Data Source: Jetpack, Retrofit Okhttp Square .
, , , ( , , Jetpack ;-) ). , . , Dropbox Store, , .
, Store, . ,
«… , , . , , , ».
. , , , . , .
Store?
, , Store, Android- . — , . , UX. , , . , . Store, .
, , . …

Store :

Store
, , Store, , , .
4 – Android . , . , Room SQLDelight, , . -, push-, Firebase, «» . Store , , , , , . , Store: http://github.com/dropbox/Store.
Store 4
. RxJava , Flow
.
, , , , RxJava? . , , . , . , , , , .
— . RxJava - . API RxJava :
@CheckReturnValue
public final Disposable subscribe(Consumer onNext) {}
, , RxJava Observable Disposable . dispose(), . . RxJava2 @CheckReturnValue
— , flowable.subscribe , . , , . , RxJava, .
RxJava , dispose(). . RxJava, , , Kotlin Flow , . , Flow . Flow , .
suspend fun Flow.collect(...)
Collect RxJava, , Flow. RxJava, collect()
"suspend"
. , ( async/await
), . Flow.collect
, , .
, Android ( ) , , . , Kotlin, , viewModelScope
Jetpack, , . , Android: , .
public fun CoroutineScope.launch(...)
viewModelScope.launch {
flow.collect{ handle(it) }
}
, Flow. Android. , AndroidX . , ViewModel, , Room Flow. , (Paging). Store , Android , .
, Store , Android, , , , Kotlin multi-platform, . RxJava Kotlin native/js 6000 .
Store?
Store . Store, Fetcher
, , , . , Store . Store Flow, — ! Store // , , .
Store
, Store. , :
StoreBuilder.fromNonFlow { api.fetchSubreddit(it, "10")}
.persister(
reader = db.postDao()::loadPosts,
writer = db.postDao()::insertPosts,
delete = db.postDao()::clearFeed)
.cachePolicy(MemoryPolicy)
.build()
:
Store . persister() Store. , Observable, Jetpack Room, SQLDelight Realm.
:
Store
Store . , Flow, , ReturnType.
val store = StoreBuilder.from {
articleId -> api.getArticle(articleId)
}
.build()
Store , , toString()
, equals()
hashCode()
. Fetcher . . , equals()
hashcode()
data- Kotlin.
: Stream
API, Store, :
fun stream(request: StoreRequest<Key>):Flow<StoreResponse>Output>>
StoreRequest
, , . StoreResponse
. StoreResponse — Kotlin, Loading
, Data
Error
. StoreResponse ResponseOrigin, , .

Loading
ResponseOrigin. .Data
, , Store.Error
, , ResponseOrigin.
Store , StoreResponse.Error
, Flow , , . - , render
/updateUI
. . :
lifecycleScope.launchWhenStarted {
store.stream(StoreRequest.cached(key = key, refresh=true)).collect { response ->
when(response) {
is StoreResponse.Loading -> showLoadingSpinner()
is StoreResponse.Data -> {
if (response.origin == ResponseOrigin.Fetcher) hideLoadingSpinner()
updateUI(response.value)
}
is StoreResponse.Error -> {
if (response.origin == ResponseOrigin.Fetcher) hideLoadingSpinner()
showError(response.error)
}
}
}
}
: Store.get(key)
, Store.stream(key)
Store.fresh(key)
.
suspend fun Store.get(key: Key): Value
— . , .suspend fun Store.fresh(key: Key): Value
— , .suspend fun Store.stream(key: Key): Flow
— (Flow
) .
get()
:
lifecycleScope.launchWhenStarted {
val article = store.get(key)
updateUI(article)
}
store.get(key), ( ), . store.get(key) , . ( ) , . , , , Store. Store . Store , , .
store.fresh(key)
( ). , fresh() , store.get()
/stream()
. fresh() pull-to-refresh
.
fresh()
get()
.
Stream
, store.stream(key)
, , , / . stream() , .
lifecycleScope.launchWhenStarted {
store.stream(StoreRequest.cached(3, refresh = false))
.collect{ }
store.stream(StoreRequest.get(3))
.collect{ }

, Store . , , , . , . Store.get() 12 . , . .
Store , persister()
. , , Store , , .
persister()
, Flow
Store . , , Store, Store.
, Observable (Jetpack Room, SQLDelight Realm), , , UX.
StoreBuilder.fromNonFlow {api.fetchSubreddit(it, "10")}
.persister(
reader = db.postDao()::loadPosts,
writer = db.postDao()::insertPosts,
delete = db.postDao()::clearFeed)
.cachePolicy(MemoryPolicy)
.build()
Store , . , Store (Realm, SQLite, Firebase ..). SQLite Room, Jetpack.
API Store — , . :
- , Room
- (
StoreRequest
) - (
stream
) - API, Kotlin.
, Store. , , Android, . , -, - . , , .
KotlinConf:
, , Android Open Source Project, , Creative Commons 2.5 Attribution License