展平观察到的可观测量

时间:2018-04-19 19:45:03

标签: rx-java observable reactivex rx-kotlin

我想要做的是创建一个每秒运行另一个函数的函数。第二个函数返回Observables<A>,我希望第一个函数也返回Observables<A>而不是Observable<Observable<A>>

例如:

private A calcA(){
   ...
   return new A(...)
}

public Observable<A> getAs(){
   return Observable.create( subscriber -> {
      Bool condition = ...
      do {
         subscriber.onNext(calcA())
      } while (condition)
      subscriber.onComplete()
   })
}

public Observable<A> pollAs(){
   return Observable.create(subscriber -> {
      do {
         subscriber.onNext(getAs()) // Flatten here I guess
         Thread.sleep(1000)
      } while(true)
   })

所以我想做类似的事情(我尝试用Java-ish的方式写这个,但我会用Kotlin)

2 个答案:

答案 0 :(得分:2)

您不需要使用flatMap()运算符来展平内部observable,因为您只想重复订阅相同的observable。

public Observable<A> getAs() {
   return Observable.fromCallable( () -> calcA() )
            .repeat()
            .takeWhile( v -> !condition( v );
}

getAs()将发出项目,直到达到条件。然后它将完成。

public Observable<A> pollAs(){
   return getAs()
            .repeatWhen( completed -> completed.delay(1000, TimeUnit.MILLISECONDS) );

pollAs()会不断重新订阅getAs()观察点,暂停每次订阅之间的一秒钟。

修改:我已将一个为期6个月的示例上传到https://pastebin.com/kSmi24GF 它表明你必须不断推进数据出来的时间。

答案 1 :(得分:0)

我提出了这个解决方案:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/activatedBackgroundIndicator">

    <LinearLayout android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="3dip"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="5dip">

        <ImageView
            android:id="@+id/photo_thumbnail"
            android:layout_width="106dp"
            android:layout_height="77dp" />
    </LinearLayout>

    <TextView
        android:id="@+id/photo_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dp"
        android:text="Album Name"
        android:textColor="#0984e3"
        android:textSize="25dip"
        android:textStyle="bold"
        android:typeface="sans" />

</RelativeLayout>

我真的不喜欢这个有人能给我看一个更方便的方式吗?