Rxjava

參考 http://gank.io/post/560e15be2dca930e00da1083

Rxjava的基本用法:

基礎(chǔ)使用

    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> o) {
              subscriber.onNext("hello,Rx");
              subscriber.onCompleted();
        }
    });
    Observer observer = new Observer() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(Object o) {
        }
    };
    observable.subscribe(observer);

Observable observable = Observable.create(new onSubscribe);

public interface OnSubscribe<T> extends Action1<Subscriber<? super T>> {
}
public interface Action1<T> extends Action {
    void call(T t);
}
public interface Action extends Function {
}

public class Observable<T> {
    final OnSubscribe<T> onSubscribe;
    private static final RxJavaObservableExecutionHook hook = RxJavaPlugins.getInstance().getObservableExecutionHook();

    public final static <T> Observable<T> create(OnSubscribe<T> f) {
    return new Observable<T>(hook.onCreate(f));
    }
    protected Observable(OnSubscribe<T> f) {
    this.onSubscribe = f;
    }
}
public abstract class RxJavaObservableExecutionHook {
     public <T> OnSubscribe<T> onCreate(OnSubscribe<T> f) {
     return f;
}

Observable類(lèi)里存在成員變量onSubscribe。
Observable.create方法的參數(shù)是OnSubscribe的實(shí)現(xiàn)類(lèi)。方法里調(diào)用了構(gòu)造方法Observable(OnSubscribe)。參數(shù)是hook.oncreate(OnSubscribe)的返回值,追入hook類(lèi),hook.onCreate(OnSubscribe)方法返回傳入的onSubscribe,所以構(gòu)造方法的參數(shù)就是我們傳入的onSubscribe對(duì)象。
所以,create方法的作用是創(chuàng)建一個(gè)Observable,并將傳入的onSubscribe賦值給自己的成員變量。

Observer observer = new Observer() ;

public interface Observer<T> {
void onCompleted();
void onError(Throwable e);
void onNext(T t);
}

創(chuàng)建一個(gè)Observer接口的實(shí)現(xiàn)類(lèi)。

observable.subscribe(observer);

public final Subscription subscribe(final Observer<? super T> observer) {
    if (observer instanceof Subscriber) {
        return subscribe((Subscriber<? super T>)observer);
    }
    return subscribe(new Subscriber<T>() {
        @Override
        public void onCompleted() {
            observer.onCompleted();
        }
        @Override
        public void onError(Throwable e) {
            observer.onError(e);
        }
        @Override
        public void onNext(T t) {
            observer.onNext(t);
        }
    });
}

Observable類(lèi)的subscribe方法是將傳入的Observer對(duì)象封裝成Subscriber對(duì)象。

public abstract class Subscriber<T> implements Observer<T>, Subscription {

private static final Long NOT_SET = Long.MIN_VALUE;
private final SubscriptionList subscriptions;
private final Subscriber<?> subscriber;
private Producer producer;
private long requested = NOT_SET; // default to not set

protected Subscriber() {
    this(null, false);
}

//...其他構(gòu)造方法和成員方法

public final void add(Subscription s) {
    subscriptions.add(s);
}
@Override
public final void unsubscribe() {
    subscriptions.unsubscribe();
}
@Override
public final boolean isUnsubscribed() {
    return subscriptions.isUnsubscribed();
}
public void onStart() {
    // 空實(shí)現(xiàn)
} 
}
public interface Subscription {
void unsubscribe();
boolean isUnsubscribed();
}

subscriber實(shí)現(xiàn)了Observer和Subscription的抽象類(lèi),Subcriptions暫且用不到,我也不知道是干啥的。

Observable的subscribe方法將傳入的Observer對(duì)象封裝成Subscriber對(duì)象之后,調(diào)用subscribe(Subscriber)方法,且傳入的第二個(gè)參數(shù)是Observable本身。

public final Subscription subscribe(Subscriber<? super T> subscriber) {
    return Observable.subscribe(subscriber, this);
}

調(diào)用重載方法subscribe(Subscriber, Observable)

private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
    if (subscriber == null) {
        throw new IllegalArgumentException("observer can not be null");
    }
    if (observable.onSubscribe == null) {
        throw new IllegalStateException("onSubscribe function can not be null.");
    }
    subscriber.onStart();   
    if (!(subscriber instanceof SafeSubscriber)) { //包裝成安全的subscriber
        subscriber = new SafeSubscriber<T>(subscriber);
    }
    try {
        hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
        return hook.onSubscribeReturn(subscriber);
    } catch (Throwable e) {       
        Exceptions.throwIfFatal(e);
        try {
            subscriber.onError(hook.onSubscribeError(e));
        } catch (Throwable e2) {
            Exceptions.throwIfFatal(e2);   
            RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
            hook.onSubscribeError(r);
            throw r;
        }
        return Subscriptions.unsubscribed();
    }
}

方法里首先判空,然后調(diào)用了subscriber的onstart方法,再將subscriber對(duì)象包裝成安全的subscriber,調(diào)用hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);

public <T> OnSubscribe<T> onSubscribeStart(Observable<? extends T> observableInstance, final OnSubscribe<T> onSubscribe) {
    // pass-thru by default
    return onSubscribe;
}

hook.onSubscribeStart返回observable.onSubcribe對(duì)象。調(diào)用call()方法并將subscriber作為參數(shù)傳入。call方法是在第一步創(chuàng)建Observable對(duì)象時(shí)實(shí)現(xiàn)的。hook.onSubscribeReturn(subscriber)返回subscriber對(duì)象。

Just && From

 Observable.just("hello").subscribe(observer);
 Observable.from(new String[]{"hello","Rx"}).subscribe(observer);

just

public final static <T> Observable<T> just(final T value) {
    return ScalarSynchronousObservable.create(value);
}
 public static final <T> ScalarSynchronousObservable<T> create(T t) {
    return new ScalarSynchronousObservable<T>(t);
}

protected ScalarSynchronousObservable(final T t) {
    super(new OnSubscribe<T>() {
        @Override
        public void call(Subscriber<? super T> s) { 
             s.onNext(t);
            s.onCompleted();
        }
    });
    this.t = t;
}

from

public final static <T> Observable<T> from(Iterable<? extends T> iterable) {
    return create(new OnSubscribeFromIterable<T>(iterable));
}
public final class OnSubscribeFromIterable<T> implements OnSubscribe<T> {

final Iterable<? extends T> is;

public OnSubscribeFromIterable(Iterable<? extends T> iterable) {
    if (iterable == null) {
        throw new NullPointerException("iterable must not be null");
    }
    this.is = iterable;
}
@Override
public void call(final Subscriber<? super T> o) {
    final Iterator<? extends T> it = is.iterator();
    if (!it.hasNext() && !o.isUnsubscribed())
        o.onCompleted();
    else 
        // 調(diào)用subscriber的setProducer方法,內(nèi)部是迭代Iterator獲取參數(shù)并調(diào)用onNext方法
        o.setProducer(new IterableProducer<T>(o, it)); 
}
}
public void setProducer(Producer p) {
    long toRequest;
    boolean passToSubscriber = false;
    synchronized (this) {
        toRequest = requested;
        producer = p;
        if (subscriber != null) { //假
            if (toRequest == NOT_SET) {
                // we pass-thru to the next producer as nothing has been requested
                passToSubscriber = true;
            }
        }
    }
    if (passToSubscriber) { //假
        subscriber.setProducer(producer);
    } else {
        if (toRequest == NOT_SET) {
            producer.request(Long.MAX_VALUE); //走這里 調(diào)用IterableProducer的request方法
        } else {
            producer.request(toRequest);
        }
    }
}
private static final class IterableProducer<T> extends AtomicLong implements Producer {   
public void request(long n) {
        if (get() == Long.MAX_VALUE) { // get是AtomicLong的方法。此處是0。
            return;
        }
        // 比較對(duì)象的Value是否等于0,如果是就為Value賦值Long.MAX_VALUE并返回true。此處為true
        // 調(diào)用fastpath();
        if (n == Long.MAX_VALUE && compareAndSet(0, Long.MAX_VALUE)) { 
            fastpath();
        } else 
        if (n > 0 && BackpressureUtils.getAndAddRequest(this, n) == 0L) {
            slowpath(n);
        }
    }
}
 // 迭代調(diào)用onNext方法
void fastpath() {
        final Subscriber<? super T> o = this.o;
        final Iterator<? extends T> it = this.it;

        while (true) {
            if (o.isUnsubscribed()) {
                return;
            } else if (it.hasNext()) {
                o.onNext(it.next());
            } else if (!o.isUnsubscribed()) {
                o.onCompleted();
                return;
            } else {
                // is unsubscribed
                return;
            }
        }
    }

ActionX

  Action1<String> action1 = new Action1<String>() {
        @Override
        public void call(String str) {
            Log.d(tag,str);
        }
    };
 Observable.just("hello").subscribe(action1);

以上是簡(jiǎn)單用法。ActionX的X代表call方法里參數(shù)的個(gè)數(shù)。

public final Subscription subscribe(final Action1<? super T> onNext) {
    if (onNext == null) {
        throw new IllegalArgumentException("onNext can not be null");
    }
    return subscribe(new Subscriber<T>() {
        @Override
        public final void onCompleted() {
            // do nothing
        }
        @Override
        public final void onError(Throwable e) {
            throw new OnErrorNotImplementedException(e);
        }
        @Override
        public final void onNext(T args) {
            onNext.call(args);
        }
    });
}

subscribe方法把Action1包裝成一個(gè)Subscriber對(duì)象。并且在onNext方法里調(diào)用action1的call方法。
類(lèi)似的方法有:

    subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError)  
    subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onComplete)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容