Last active
July 22, 2019 00:22
-
-
Save pbochenski/1ff98db674fd2542987f7b6ee1a52f7b to your computer and use it in GitHub Desktop.
LiveData meets RxJava
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| compile "android.arch.lifecycle:reactivestreams:$archVersion" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class PostRepo(private val api: Api) { | |
| private sealed class Command { | |
| class Reset(val size: Int) : Command() | |
| class LoadMore(val position: Int, val size: Int) : Command() | |
| } | |
| private var itemIds = emptyList<Long>() | |
| private val commands = MutableLiveData<Command>() | |
| val posts: LiveData<List<Item>> = commands.switchMap { | |
| ... | |
| } | |
| fun load(size: Int) { | |
| itemIds = emptyList() | |
| commands.value = Command.Reset(size) | |
| } | |
| fun loadMore(size: Int) { | |
| commands.value = Command.LoadMore(posts.value?.size ?: 0, size) | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| fun <T, R> LiveData<T>.switchMap(f: (T) -> LiveData<R>): LiveData<R> = Transformations.switchMap(this, f) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| val posts: LiveData<List<Item>> = commands.switchMap { | |
| val command = it | |
| LiveDataReactiveStreams.fromPublisher<List<Item>> { | |
| when (command) { | |
| is Command.Reset -> { | |
| getFirst(command.size) | |
| } | |
| is PostRepo.Command.LoadMore -> { | |
| getMore(command.position, command.size) | |
| } | |
| } | |
| .subscribeOn(Schedulers.io()) | |
| .observeOn(AndroidSchedulers.mainThread()) | |
| .toFlowable() | |
| .subscribe(it) | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class MainViewModel(app: Application) : AndroidViewModel(app) { | |
| private val postRepo = getApplication<App>().postRepo | |
| private val LOAD_ITEM_COUNT = 15 | |
| fun getPosts(): LiveData<List<Post>> { | |
| return postRepo.posts.map { | |
| it.map { Post(it.id, it.title, it.url) } | |
| } | |
| } | |
| fun refresh() { | |
| postRepo.load(LOAD_ITEM_COUNT) | |
| } | |
| fun loadMore() { | |
| postRepo.loadMore(LOAD_ITEM_COUNT) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment