创建一个Observable的几种方法
1. create()
通过.create(new Observable.OnSubscribe())方法创建一个Observable,在参数OnSubscribe的call()方法里发射动作,以及接收逻辑。下面的例子描述的是获取手机中已安装应用的信息:
Observable.create(new Observable.OnSubscribe<AppInfo>() {
@Override
public void call(Subscriber<? super AppInfo> subscriber) {
List<AppInfoRich> apps = new ArrayList<>();
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(mainIntent, 0);
for (ResolveInfo info : infos) {
apps.add(new AppInfoRich(context, info));
}
for (AppInfoRich appInfoRich : apps) {
Bitmap icon = Utils.drawableToBitmap(appInfoRich.getIcon());
String name = appInfoRich.getName();
String iconPaht = mFileDir + "/" + name;
Utils.storeBitmap(context, icon, name);
if (subscriber.isUnsubscribed()) {
return;
}
subscriber.onNext(new AppInfo(name, iconPaht, appInfoRich.getLastUpdateTime()));
}
if (!subscriber.isUnsubscribed()) {
subscriber.onCompleted();
}
}
});
2. from()
依次发生一个数组或集合的元素。
通过Observable.from(list),创建一个依次发射数组或集合的Observable.
just()
通过Observable.just(T t1,T t2,T t3),依次发送独立对象。repeat();
重复发送,例如Observable.just(T t1,T t2,T t3).repeat(3),just里的元素每个发送3次,将总共发射9次。defer()
有一些场景,你只想声明一个Observable,但想延迟创建,直到有观察者订阅它。range()
需要从一个特定的x开始发射n个整个。Observable.from(list).range(10,3),从第十个元素开始发射3个元素。interval()
当你想创建一个轮询的程序时,使用interval(),有两个参数,一个是指定两个发射item中间的间隔时间数,一个是时间单位:
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();
}
});
- timer()
如果你想在一定的时间间隔后发射一个item,你可以像下面一样使用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秒后发射第0个元素,然后结束。下面的例子,是使用带三个参数的timer():
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);
}
});
这段代码中,你可以创建一个延迟3秒,然后每3秒发射一次item的interval()版本。
过滤Observable
1. 过滤一个序列
filter()方法可以确保在观察序列当中只需要的值。
过滤掉不以C开头的应用信息:
.filter(new Func1<AppInfo, Boolean>() {
@Override
public Boolean call(AppInfo appInfo) {
return appInfo.getName().startsWith("C");
}
})
过滤掉为null的应用信息:
.filter(new Func1<AppInfo, Boolean>() {
@Override
public Boolean call(AppInfo appInfo) {
return appInfo != null;
}
})