android架構師之路——RXJava實現方式解析

簡介

一個可觀測的序列來組成異步的、基於事件的程序的庫。(簡單來說:它就是一個實現異步操作的庫)

GitHub地址:https://github.com/ReactiveX/Rxjava 

本文得目的

簡單解析RXJava原理,RXJava的被觀察者,觀察者,發射器簡單實現,最終完成以下代碼

  1. 操作符create創建被觀察者
  2. 轉換符map實現字符串轉換
  3. subscribeOn 線程池轉換
  4. observeOn主線程轉換
    private void test() {
        //創建
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) {
                emitter.onNext("125");
                emitter.onComplete();
            }
        });
        //map方法
        observable.map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                Log.d(TAG, "--apply--" + s+ "---" + Thread.currentThread().getName());
                return Integer.parseInt(s);
            }
        }).subscribeOn()//map方法在線程池中調用
                .observeOn()//主線程中調用
                .subscribe(new Observer<Integer>() { //處理結果
            @Override
            public void onSubscribe(Disposeble d) {
                Log.d(TAG, "onSubscribe   " + d + "---" + Thread.currentThread().getName());
            }

            @Override
            public void onNext(Integer s) {
                Log.d(TAG, "onNext   " + s+ "---" + Thread.currentThread().getName());
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError   " + e+ "---" + Thread.currentThread().getName());
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete   "+ "---" + Thread.currentThread().getName());
            }
        });

    }

具體實現

  • 創建被觀察者
//創建
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) {
             emitter.onNext("125");
             emitter.onComplete();
        }
});

create是在Observable中一個靜態方法

    //創建被觀察者
    public static<T> Observable<T> create(ObservableOnSubscribe<T> observable) {
        return new ObservableCreate(observable);
    }
create方法中,傳遞了一個ObservableOnSubscribe接口,這個接口包含了subscribe方法
public interface ObservableOnSubscribe<T> {
    void subscribe(ObservableEmitter<T> emitter);
}

ObservableOnSubscribe這接口中,傳遞了一個ObservableEmitter接口

public interface ObservableEmitter<T> {
    //發出正常值信號
    void onNext(T value);
    //發出一個Throwable異常信號
    void onError(Throwable throwable);
    //發出完成的信號
    void onComplete();
}
  • 創建觀察者
public interface Observer<T> {
    void onSubscribe(Disposeble d);

    void onNext(T t);

    void onError(Throwable e);

    void onComplete();
}
  • 發射器(鏈接被觀察者與觀察者) 這裏就是聯動觀察者與被觀察者的主要方法
    //發射器綁定
    public void subscribe(Observer observer) {
        subscribeActual(observer);
    }

聯動的具體實現

public class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        CreateEmitter<T> parent = new CreateEmitter<>(observer);
        observer.onSubscribe(parent);   //通知觀察者訂閱成功

        try {
            source.subscribe(parent);
        } catch (Exception e) {
            e.printStackTrace();
            parent.onError(e);
        }
    }

    static final class CreateEmitter<T> implements ObservableEmitter<T>, Disposeble {
        final Observer<? super T> observer;
        private boolean bool;

        public CreateEmitter(Observer<? super T> observer) {
            this.observer = observer;
        }

        @Override
        public void onNext(T value) {
            if(!bool){
                observer.onNext(value); //observer === MapObserver
            }
        }

        @Override
        public void onError(Throwable throwable) {
            if(!bool) {
                observer.onError(throwable);
            }
        }

        @Override
        public void onComplete() {
            if(!bool) {
                observer.onComplete();
            }
        }

        @Override
        public void dispose(boolean bool) {
            this.bool = bool;
        }

        @Override
        public boolean isDisposed() {
            return bool;
        }
    }
}

map聯動具體實現

public class ObservableMap<T, R> extends Observable<R> {
    protected final Observable<T> source;
    final Function<? super T, ? extends R> function;

    public ObservableMap(Observable<T> source, Function<? super T, ? extends R> function) {
        this.function = function;
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer<? super R> observer) {
        source.subscribe(new MapObserver<>(observer, function));
    }


    //觀察者
    static final  class MapObserver<T, U> extends BasicFuseableObserver<T, U>{
        final Function<? super T, ? extends U> mapper;

        public MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
            super(actual);
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            U apply = mapper.apply(t);

            actual.onNext(apply);
        }
    }
}

線程池方法具體實現

public class ObservableSubscribeOn<T, R> extends Observable<R> {

    protected final Observable<T> source;
    private static ExecutorService executorService = Executors.newCachedThreadPool();
    public ObservableSubscribeOn(Observable<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer<? super R> observer) {
        //從新包裝observer
        final SubscribeOnObserver parent = new SubscribeOnObserver(observer);
        //告訴下游觀察者訂閱成功
        observer.onSubscribe(parent);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                source.subscribe(parent);
            }
        });
    }


    static final class SubscribeOnObserver<T> implements Observer<T>, Disposeble{
        final Observer<? super  T> actual;
        Disposeble<T> disposeble;

        public SubscribeOnObserver(Observer<? super T> actual) {
            this.actual = actual;
        }

        @Override
        public void dispose(boolean bool) {
            this.disposeble.dispose(bool);
        }

        @Override
        public boolean isDisposed() {
            return this.disposeble.isDisposed();
        }

        @Override
        public void onSubscribe(Disposeble d) {
            this.disposeble = d;
        }

        @Override
        public void onNext(T t) {
            this.actual.onNext(t);
        }

        @Override
        public void onError(Throwable e) {
            this.actual.onError(e);
        }

        @Override
        public void onComplete() {
            this.actual.onComplete();
        }
    }
}

主線程聯動具體實現

public class ObservableObserveOn<T> extends Observable<T> {

    protected final Observable<T> source;

    public ObservableObserveOn(Observable<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        ObserverOnObserver<T> parent = new ObserverOnObserver<>(observer);
        source.subscribe(parent);
    }


    //包裝下游觀察者,並關聯onNext,.....  放入主線程中執行
    static final class ObserverOnObserver<T> implements Observer<T>, Disposeble {
        final Observer<? super T> actual;
        Disposeble disposeble;
        private Handler handler;
        ObserverOnObserver(Observer<? super T> actual) {
            this.actual = actual;
            handler = new Handler(Looper.getMainLooper());
        }

        @Override
        public void dispose(boolean bool) {
            this.disposeble.dispose(bool);
        }

        @Override
        public boolean isDisposed() {
            return this.disposeble.isDisposed();
        }

        @Override
        public void onSubscribe(Disposeble d) {
            this.disposeble = d;
            actual.onSubscribe(d);
        }

        @Override
        public void onNext(final T t) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    actual.onNext(t);
                }
            });
        }

        @Override
        public void onError(final Throwable e) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    actual.onError(e);
                }
            });
        }

        @Override
        public void onComplete() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    actual.onComplete();
                }
            });
        }
    }
}

一個簡單的rxjava就具體實現了,詳細請參考demo demo下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章