android - zip 列表完成

标签 android rx-java

我有一个包含媒体播放器的 Sound 类,我想编写一个函数来接收声音列表并全部播放,该函数应该返回一个 可完成

interface MediaPlayer {
    fun play(): Completable
}

class Sound(val title, val mediaPlayer: MediaPlayer)

//In other class, we have a list of sound to play
val soundList = List<Sound>(mockSound1, mockSound2,..,mockSound10)

fun playSound(): Completable {
    return mockSound1.play()
}

fun playAllSounds(): Completable {
    soundList.forEach(sound -> sound.mediaPlayer.play()) //Each of this will return Completable. 

//HOW to return Completable
return ??? do we have somthing like zip(listOf<Completable>)
}


//USE
playSound().subscrible(...) //Works well

playAllSounds().subscribe()???

最佳答案

您可以使用 concat,来自文档

Returns a Completable which completes only when all sources complete, one after another.

你可以这样做:

fun playAllSounds(): Completable {
    val soundsCompletables = soundList.map(sound -> sound.mediaPlayer.play())
    return Completable.concat(soundCompletables)
}

引用:http://reactivex.io/RxJava/javadoc/io/reactivex/Completable.html#concat-java.lang.Iterable-

关于android - zip 列表完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53616800/

相关文章:

java - 关于 Android 中 putExtra 方法顺序的奇怪行为

java - Android Studio - 为什么未使用/不需要导入语句?

kotlin - 不能使用提供的参数调用以下函数

android - 如何使用 rx-kotlin 实现强大的离线支持?

android - 为 Android 测试 Titanium 的应用内计费模块

java - 我如何才能最好地保护此 javax.crypto 服务器客户端中的 IV 和 key 密码

Android 媒体播放器搜索栏从停止位置播放

java - 使用 RxAndroid 进行链 2 次调用并重试

java - 使用 RxJava CompositeSubscription 进行 Presenter 单元测试

android - 在从可观察对象发出值之前和之后设置 ProgressBar 的可见性