接着上面,上面讲了一个顾客大佬去饭馆吃饭,叫了一个服务员 弄了个小弟 小弟负责让服务员点菜,服务员搞出了个点菜单,菜单让厨师去做饭。。。。。 再看眼简单的代码Just,Rxjava的意思是产生一个或多个信号 返回完成信息。单参数的用法如下
public static void main(String[] args) {
Customer.just(5).order(new IChef<Integer>() {
@Override
public void onSubscribe(IGarbage d) {
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
System.out.println("结束");
}
});
}
就如上篇文章所示: 这次大哥Customer 叫了另外一个小弟CustomerJust 去负责点菜,连服务员都没Call,直接生成一个Just菜单,单参的只有一项,多参数的会有好几项。菜单会回调厨师的next做菜。 1 接口 ICustomer
public interface ICustomer<T>{
void order( IChef<? super T> chef);
}
IChef
public interface IChef<T>{
void onSubscribe( IGarbage d);
void onNext(T t);
void onError( Throwable e);
void onComplete();
}
IGarbage ~~Disposable
public interface IGarbage {
}
2 具体类 顾客大哥Customer
public abstract class Customer<T> implements ICustomer<T> {
@Override
public void order( IChef<? super T> chef) {
orderActual(chef);
}
public static <T> Customer<T> just(T item) {
return new CustomerJust<T>(item);
}
protected abstract void orderActual(IChef<? super T> chef);
}
从上面看到just函数就是叫了个顾客小弟 顾客小弟CustomerJust
public class CustomerJust <T> extends Customer<T> implements IGet<T>{
private final T value;
public CustomerJust(final T value) {
this.value = value;
}
@Override
protected void orderActual(IChef<? super T> chef) {
IGarbage sd = new JustOne<>(chef, value);
chef.onSubscribe(sd);
((JustOne<T>) sd).run();
}
@Override
public T get() {
return value;
}
}
顾客小弟生成了个JustOne 点菜录。 JustOne点菜单
public class JustOne<T> implements IGarbage,Runnable{
int i;
static final int START = 0;
static final int FUSED = 1;
static final int ON_NEXT = 2;
static final int ON_COMPLETE = 3;
final IChef<? super T> chef;
T value;
JustOne(IChef<? super T> chef,T value) {
this.chef =chef;
this.value=value;
}
@Override
public void run() {
if (i== START ) {
chef.onNext(value);
i=ON_NEXT;
if (i == ON_NEXT) {
i=ON_COMPLETE;
chef.onComplete();
}
}
}
}
这里需要解释下,源码中 public static final class ScalarDisposable extends AtomicInteger 这个点菜单类是原子整形,可能为了线程安全考虑,用的cas的写法 进行状态的改变。我这里简单的就是直接赋值了 重点在run这句chef.onNext(value); 就回调了厨师做饭onNext函数。
ok 两个参数的just 或者多个参数的just 会掉调用fromArray函数。这个会叫另外一个小弟 来点菜,过程差不多了。多个循环而已。 源头的顾客说完了 回头该说说加工的东西了 不知道要看多久 加油。
|