如果我可以在订阅部分执行相同的操作(过滤数据),我为什么要使用flatMap
,filter
等等?
api
.getTweetRx()
.subscribeOn(Schedulers.newThread()) //отдаем новый тред для работы в background
.observeOn(AndroidSchedulers.mainThread()) //говорим, что обсервить хотим в main thread
.flatMap(new Func1<List<Tweet>, Observable<Tweet>>() {
@Override
public Observable<Tweet> call(List<Tweet> tweets) {
return Observable.from(tweets);
}
})
.filter(new Func1<Tweet, Boolean>() {
@Override
public Boolean call(Tweet tweet) {
if (tweet.getImage()!="")
return true;
else return false;
}
})
.subscribe(new Action1<Tweet>() {
@Override
public void call(Tweet tweet) {
tweets.add(tweet);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d("!!!ERROR", "" + throwable);
}
},
new Action0() { // onComplite
@Override
public void call() { // // on main thread; all photo's loaded, time to show the list or something.
final ListView myList = (ListView) findViewById(R.id.tweet_list);
myList.setAdapter(new MyListAdapter(tweets, MainActivity.this));
}
});
答案 0 :(得分:0)
关注点的分离(以及利用他人的工作来缩短完成工作所需的时间)。
比较以下代码并确定哪种方法适合您的需求(Scala中的代码,为了进一步利用其他人的工作 - 来削减样板)。
Sample.ints
是Observable[Int]
。
Sample.ints.subscribe(new Subscriber[Int] {
override def onStart(): Unit = println("+++ onStart")
override def onNext(n: Int): Unit = println(s"+++ onNext: [$n]")
override def onError(e: Throwable): Unit = println(s"+++ onError: [$e]")
override def onCompleted(): Unit = println(s"+++ onCompleted")
})
您可能已经注意到订阅者没有做太多事情,只需打印出来的内容。
+++ onStart
+++ onNext: [0]
+++ onNext: [1]
+++ onNext: [2]
+++ onNext: [3]
+++ onNext: [4]
+++ onNext: [5]
+++ onNext: [6]
+++ onNext: [7]
+++ onNext: [8]
+++ onNext: [9]
+++ onNext: [10]
+++ onCompleted
假设我想过滤赔率。我不必更改订阅者的代码,说它不属于我,例如我没有修改和使用的源代码。
使用filter
非常简单。
Sample.ints.filter(_ % 2 == 0).subscribe(new Subscriber[Int] {
override def onStart(): Unit = println("+++ onStart")
override def onNext(n: Int): Unit = println(s"+++ onNext: [$n]")
override def onError(e: Throwable): Unit = println(s"+++ onError: [$e]")
override def onCompleted(): Unit = println(s"+++ onCompleted")
})
看看马,现在没有赔率 - 你只需要添加集成部分 - 观察者和订阅者之间的粘合剂。
+++ onStart
+++ onNext: [0]
+++ onNext: [2]
+++ onNext: [4]
+++ onNext: [6]
+++ onNext: [8]
+++ onNext: [10]
+++ onCompleted
我可以更改订阅者,但前提是您已获得源代码 - 请考虑在您不这样做的情况下可能发生的情况。
等等......