代码之家  ›  专栏  ›  技术社区  ›  coinhndp

Zip列表可完成

  •  0
  • coinhndp  · 技术社区  · 6 年前

    我有一个声音类,它包含一个媒体播放器,我想写一个函数,接收声音列表并播放它们,该函数应该返回一个 完全的

    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()???
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Ahmed Ashraf    6 年前

    你可以用 concat

    返回一个Completable,它仅在所有源相继完成时完成。

    你可以这样做:

    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-

        2
  •  1
  •   carlo.marinangeli    4 年前

    你可以试试 Completable.merge . 它将一次订阅所有的completable。 link to the docs