Rxjava学习笔记

创建一个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.

  1. just()
    通过Observable.just(T t1,T t2,T t3),依次发送独立对象。

  2. repeat();
    重复发送,例如Observable.just(T t1,T t2,T t3).repeat(3),just里的元素每个发送3次,将总共发射9次。

  3. defer()
    有一些场景,你只想声明一个Observable,但想延迟创建,直到有观察者订阅它。

  4. range()
    需要从一个特定的x开始发射n个整个。Observable.from(list).range(10,3),从第十个元素开始发射3个元素。

  5. 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();
} 
});
  1. 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;
} 
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值