在這一節(jié)中,我們將基于RxJava的just(),repeat(),defer(),range(),interval(),和timer()方法展示一些例子。
假如我們只有3個獨立的AppInfo對象并且我們想把他們轉(zhuǎn)化為Observable并填充到RecyclerView的item中:
List<AppInfo> apps = ApplicationsList.getInstance().getList();
AppInfo appOne = apps.get(0);
AppInfo appTwo = apps.get(10);
AppInfo appThree = apps.get(24);
loadApps(appOne,appTwo,appThree);
我們可以像我們之前的例子那樣檢索列表并提取出這三個元素。然后我們將他們傳到這個loadApps()函數(shù)里面:
private void loadApps(AppInfo appOne,AppInfo appTwo,AppInfo appThree) {
mRecyclerView.setVisibility(View.VISIBLE);
Observable.just(appOne,appTwo,appThree)
.subscribe(new Observer<AppInfo>() {
@Override
public void onCompleted() {
mSwipeRefreshLayout.setRefreshing(false);
Toast.makeText(getActivity(), "Here is the list!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void onNext(AppInfo appInfo) {
mAddedApps.add(appInfo);
mAdapter.addApplication(mAddedApps.size() - 1,appInfo);
}
});
}
正如你看到的,代碼和之前的例子很像。這種方法讓我們有機會來考慮一下代碼的復(fù)用。
你可以將一個函數(shù)作為參數(shù)傳給just()方法,你將會得到一個已存在代碼的原始Observable版本。在一個新的響應(yīng)式架構(gòu)的基礎(chǔ)上遷移已存在的代碼,這個方法可能是一個有用的開始點。
假如你想對一個Observable重復(fù)發(fā)射三次數(shù)據(jù)。例如,我們用just()例子中的Observable:
private void loadApps(AppInfo appOne,AppInfo appTwo,AppInfo appThree) {
mRecyclerView.setVisibility(View.VISIBLE);
Observable.just(appOne,appTwo,appThree)
.repeat(3)
.subscribe(new Observer<AppInfo>() {
@Override
public void onCompleted() {
mSwipeRefreshLayout.setRefreshing(false);
Toast.makeText(getActivity(), "Here is the list!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void onNext(AppInfo appInfo) {
mAddedApps.add(appInfo);
mAdapter.addApplication(mAddedApps.size() - 1,appInfo);
}
});
}
正如你看到的,我們在just()創(chuàng)建Observable后追加了repeat(3),它將會創(chuàng)建9個元素的序列,每一個都單獨發(fā)射。
有這樣一個場景,你想在這聲明一個Observable但是你又想推遲這個Observable的創(chuàng)建直到觀察者訂閱時??聪旅娴?code>getInt()函數(shù):
private Observable<Integer> getInt(){
return Observable.create(subscriber -> {
if(subscriber.isUnsubscribed()){
return;
}
App.L.debug("GETINT");
subscriber.onNext(42);
subscriber.onCompleted();
});
}
這比較簡單,并且它沒有做太多事情,但是它正好為我們服務(wù)?,F(xiàn)在,我們可以創(chuàng)建一個新的Observable并且應(yīng)用defer():
Observable<Integer> deferred = Observable.defer(this::getInt);
這次,deferred存在,但是getInt() create()方法還沒有調(diào)用:logcat日志也沒有“GETINT”打印出來:
deferred.subscribe(number -> {
App.L.debug(String.valueOf(number));
});
但是一旦我們訂閱了,create()方法就會被調(diào)用并且我們也可以在logcat日志中得到下賣弄兩個:GETINT和42。
你需要從一個指定的數(shù)字X開始發(fā)射N個數(shù)字嗎?你可以用range:
Observable.range(10,3)
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
Toast.makeText(getActivity(), "Yeaaah!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Integer number) {
Toast.makeText(getActivity(), "I say " + number, Toast.LENGTH_SHORT).show();
}
});
range()函數(shù)用兩個數(shù)字作為參數(shù):第一個是起始點,第二個是我們想發(fā)射數(shù)字的個數(shù)。
interval()函數(shù)在你需要創(chuàng)建一個輪詢程序時非常好用。
Subscription stopMePlease = Observable.interval(3,TimeUnit.SECONDS)
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
Toast.makeText(getActivity(), "Yeaaah!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "Something went wrong!", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Integer number) {
Toast.makeText(getActivity(), "I say " + number, Toast.LENGTH_SHORT).show();
}
});
interval()函數(shù)的兩個參數(shù):一個指定兩次發(fā)射的時間間隔,另一個是用到的時間單位。
如果你需要一個一段時間之后才發(fā)射的Observable,你可以像下面的例子使用timer():
Observable.timer(3,TimeUnit.SECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long number) {
Log.d("RXJAVA", "I say " + number);
}
});
它將3秒后發(fā)射0,然后就完成了。讓我們使用timer()的第三個參數(shù),就像下面的例子:
Observable.timer(3,3,TimeUnit.SECONDS)
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long number) {
Log.d("RXJAVA", "I say " + number);
}
});
用這個代碼,你可以創(chuàng)建一個以初始值來延遲(上一個例子是3秒)執(zhí)行的interval()版本,然后每隔N秒就發(fā)射一個新的數(shù)字(前面的例子是3秒)。