我想要做的是创建一个每秒运行另一个函数的函数。第二个函数返回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)
答案 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>
我真的不喜欢这个有人能给我看一个更方便的方式吗?