轉自:http://blog.csdn.net/nicolelili1/article/details/52038211
Observable.create()
create()方法使開發者有能力從頭開始創建一個Observable。它需要一個OnSubscribe對象,這個對象繼承Action1,當觀察者訂閱我們的Observable時,它作為一個參數傳入並執行call()函數。
|
1
2
3
4
5
6
7
|
Observable.create(new Observable.OnSubscribe<Object>(){
@Override
public void call(Subscriber<? super Object> subscriber) {
}
});
|
Observable通過使用subscriber變量並根據條件調用它的方法來和觀察者通信。讓我們看一個“現實世界”的例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
Observable<Integer> observableString = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> observer) {
for (int i = 0; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
}
});
Subscription subscriptionPrint = observableString.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh,no! Something wrong happened!");
}
@Override
public void onNext(Integer item) {
System.out.println("Item is " + item);
}
});
|
例子故意寫的簡單,是因為即便是你第一次見到RxJava的操作,我想讓你明白接下來要發生什么。
我們創建一個新的Observable<Integer>,它執行了5個元素的for循環,一個接一個的發射他們,最后完成。
另一方面,我們訂閱了Observable,返回一個Subscription
。一旦我們訂閱了,我們就開始接受整數,並一個接一個的打印出它們。我們並不知道要接受多少整數。事實上,我們也無需知道是因為我們為每種場景都提供對應的處理操作:
* 如果我們接收到了整數,那么就打印它。
* 如果序列結束,我們就打印一個關閉的序列信息。
* 如果錯誤發生了,我們就打印一個錯誤信息。
Observable.from()
在上一個例子中,我們創建了一個整數序列並一個一個的發射它們。假如我們已經有一個列表呢?我們是不是可以不用for循環而也可以一個接一個的發射它們呢?
在下面的例子代碼中,我們從一個已有的列表中創建一個Observable序列:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
List<Integer> items = new ArrayList<Integer>();
items.add(1);
items.add(10);
items.add(100);
items.add(200);
Observable<Integer> observableString = Observable.from(items);
Subscription subscriptionPrint = observableString.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("Observable completed");
}
@Override
public void onError(Throwable e) {
System.out.println("Oh,no! Something wrong happened!");
}
@Override
public void onNext(Integer item) {
System.out.println("Item is " + item);
}
});
|
輸出的結果和上面的例子絕對是一樣的。
from()創建符可以從一個列表/數組來創建Observable,並一個接一個的從列表/數組中發射出來每一個對象,或者也可以從Java Future類來創建Observable,並發射Future對象的.get()方法返回的結果值。傳入Future作為參數時,我們可以指定一個超時的值。Observable將等待來自Future的結果;如果在超時之前仍然沒有結果返回,Observable將會觸發onError()方法通知觀察者有錯誤發生了。
