在這一節(jié)中,我們將基于RxJava的just(),repeat(),defer(),range(),interval(),和timer()方法展示一些例子。
假如我們只有3個(gè)獨(dú)立的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);
我們可以像我們之前的例子那樣檢索列表并提取出這三個(gè)元素。然后我們將他們傳到這個(gè)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);
}
});
}
正如你看到的,代碼和之前的例子很像。這種方法讓我們有機(jī)會(huì)來考慮一下代碼的復(fù)用。
你可以將一個(gè)函數(shù)作為參數(shù)傳給just()方法,你將會(huì)得到一個(gè)已存在代碼的原始Observable版本。在一個(gè)新的響應(yīng)式架構(gòu)的基礎(chǔ)上遷移已存在的代碼,這個(gè)方法可能是一個(gè)有用的開始點(diǎn)。
假如你想對一個(gè)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),它將會(huì)創(chuàng)建9個(gè)元素的序列,每一個(gè)都單獨(dú)發(fā)射。
有這樣一個(gè)場景,你想在這聲明一個(gè)Observable但是你又想推遲這個(gè)Observable的創(chuàng)建直到觀察者訂閱時(shí)??聪旅娴?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)建一個(gè)新的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()方法就會(huì)被調(diào)用并且我們也可以在logcat日志中得到下賣弄兩個(gè):GETINT和42。
你需要從一個(gè)指定的數(shù)字X開始發(fā)射N個(gè)數(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ù)用兩個(gè)數(shù)字作為參數(shù):第一個(gè)是起始點(diǎn),第二個(gè)是我們想發(fā)射數(shù)字的個(gè)數(shù)。
interval()函數(shù)在你需要?jiǎng)?chuàng)建一個(gè)輪詢程序時(shí)非常好用。
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ù)的兩個(gè)參數(shù):一個(gè)指定兩次發(fā)射的時(shí)間間隔,另一個(gè)是用到的時(shí)間單位。
如果你需要一個(gè)一段時(shí)間之后才發(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()的第三個(gè)參數(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);
}
});
用這個(gè)代碼,你可以創(chuàng)建一個(gè)以初始值來延遲(上一個(gè)例子是3秒)執(zhí)行的interval()版本,然后每隔N秒就發(fā)射一個(gè)新的數(shù)字(前面的例子是3秒)。