RxJava源码(二)

使用时:

      Observable.just("xxxxx")
            .map(new Function() {
                @Override
                public Object apply(@NonNull String s) throws Exception {
                    return null;
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    
                }

                @Override
                public void onNext(@NonNull Object o) {

                }

                @Override
                public void onError(@NonNull Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
 
 

注意到

             .subscribeOn(Schedulers.io())//子线程执行
            .observeOn(AndroidSchedulers.mainThread()) //主线程

一、子线程执行

执行
代表线程切换,源码分析

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.CUSTOM)
public final Observable subscribeOn(Scheduler scheduler) {
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    return RxJavaPlugins.onAssembly(new ObservableSubscribeOn(this, scheduler));
}

进入ObservableSubscribeOn类,只需要分析

 @Override
 public void subscribeActual(final Observer s) {
    final SubscribeOnObserver parent = new SubscribeOnObserver(s);

    s.onSubscribe(parent);

    parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
}

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

方法中

      parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));

SubscribeTask是一个Runnable

final class SubscribeTask implements Runnable {
    private final SubscribeOnObserver parent;

    SubscribeTask(SubscribeOnObserver parent) {
        this.parent = parent;
    }

    @Override
    public void run() {
        source.subscribe(parent);
    }
}

scheduler.scheduleDirect()方法传入一个Runnable ,scheduler为
.subscribeOn(Schedulers.io())中Schedulers.io()看一下代码

  @NonNull
  public static Scheduler io() {
    return RxJavaPlugins.onIoScheduler(IO);
}

IO初始化为

IO = RxJavaPlugins.initIoScheduler(new IOTask());

进一步

static final class IOTask implements Callable {
    @Override
    public Scheduler call() throws Exception {
        return IoHolder.DEFAULT;
    }
}

IoHolder.DEFAULT

static final class IoHolder {
    static final Scheduler DEFAULT = new IoScheduler();
}

IoScheduler

public IoScheduler() {
    this(WORKER_THREAD_FACTORY);
}

WORKER_THREAD_FACTORY为线程工厂

  static final RxThreadFactory WORKER_THREAD_FACTORY;

看一下 this(WORKER_THREAD_FACTORY);

   public IoScheduler() {
    this(WORKER_THREAD_FACTORY);
}

/**
 * @param threadFactory thread factory to use for creating worker threads. Note that this takes precedence over any
 *                      system properties for configuring new thread creation. Cannot be null.
 */
public IoScheduler(ThreadFactory threadFactory) {
    this.threadFactory = threadFactory;
    this.pool = new AtomicReference(NONE);
    start();
}

pool 为线程池 , start();方法

@Override
public void start() {
    CachedWorkerPool update = new CachedWorkerPool(KEEP_ALIVE_TIME, KEEP_ALIVE_UNIT, threadFactory);
    if (!pool.compareAndSet(NONE, update)) {
        update.shutdown();
    }
}

CachedWorkerPool类

            private final ConcurrentLinkedQueue expiringWorkerQueue;//线程安全的集合,联想到eventbus中保证集合如下,先复制,再添加
RxJava源码(二)_第1张图片
image.png

总之是封装一个线程池对象,回到

     parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));

中scheduler.scheduleDirect()方法再Scheduler类

@NonNull
public Disposable scheduleDirect(@NonNull Runnable run) {
    return scheduleDirect(run, 0L, TimeUnit.NANOSECONDS);
}

scheduleDirect具体实现

  @NonNull
 public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
    final Worker w = createWorker();

    final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);

    DisposeTask task = new DisposeTask(decoratedRun, w);

    w.schedule(task, delay, unit);

    return task;
}

createWorker();方法在IoScheduler类实现

  @Override
  public Worker createWorker() {
    return new EventLoopWorker(pool.get());
}

w.schedule(task, delay, unit);方法IoScheduler类实现

    @Override
    public Disposable schedule(@NonNull Runnable action, long delayTime, @NonNull TimeUnit unit) {
        if (tasks.isDisposed()) {
            // don't schedule, we are unsubscribed
            return EmptyDisposable.INSTANCE;
        }

        return threadWorker.scheduleActual(action, delayTime, unit, tasks);
    }

threadWorker为

   EventLoopWorker(CachedWorkerPool pool) {
        this.pool = pool;
        this.tasks = new CompositeDisposable();
        this.threadWorker = pool.get();
    }

threadWorker.scheduleActual()为NewThreadWorker

      public Disposable scheduleDirect(final Runnable run, long delayTime, TimeUnit unit) {
    ScheduledDirectTask task = new ScheduledDirectTask(RxJavaPlugins.onSchedule(run));
    try {
        Future f;
        if (delayTime <= 0L) {
            f = executor.submit(task);
        } else {
            f = executor.schedule(task, delayTime, unit);
        }
        task.setFuture(f);
        return task;
    } catch (RejectedExecutionException ex) {
        RxJavaPlugins.onError(ex);
        return EmptyDisposable.INSTANCE;
    }
}

是一些线程池

二、 主线程执行

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.CUSTOM)
public final Observable observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    ObjectHelper.verifyPositive(bufferSize, "bufferSize");
    return RxJavaPlugins.onAssembly(new ObservableObserveOn(this, scheduler, delayError, bufferSize));
}

ObservableObserveOn类中

 @Override
protected void subscribeActual(Observer observer) {
    if (scheduler instanceof TrampolineScheduler) {
        source.subscribe(observer);
    } else {
        Scheduler.Worker w = scheduler.createWorker();

        source.subscribe(new ObserveOnObserver(observer, w, delayError, bufferSize));
    }
}

发现

        Scheduler.Worker w = scheduler.createWorker();

        source.subscribe(new ObserveOnObserver(observer, w, delayError, bufferSize));

onNext中

   @Override
    public void onNext(T t) {
        if (done) {
            return;
        }

        if (sourceMode != QueueDisposable.ASYNC) {
            queue.offer(t);
        }
        schedule();
    }

schedule();方法

  void schedule() {
        if (getAndIncrement() == 0) {
            worker.schedule(this);
        }
    }

.observeOn(AndroidSchedulers.mainThread())方法

   private static final class MainHolder {

    static final Scheduler DEFAULT = new HandlerScheduler(new Handler(Looper.getMainLooper()));
}

HandlerScheduler类

@Override
public Worker createWorker() {
    return new HandlerWorker(handler);
}

new Handler(Looper.getMainLooper()) 精华 new Handler() 和 new Handler(Looper.getMainLooper()) 的区别
new Handler() , 如果是在主线程中是没问题,但是有的时候可能会在子线程中调用,肯定就报错。
new Handler(Looper.getMainLooper()),确保创建的Handler永远在主线程中,Looper要是主线程的Looper。

三、简单实现子线程

Observable

public Observable subscribeOn(Schedulers schedulers) {
    return onAssembly(new ObservableSchedulers(this,schedulers));
}

ObservableSchedulers

final class ObservableSchedulers extends Observable {
final Observable source;
final Schedulers schedulers;

public ObservableSchedulers(Observable source, Schedulers schedulers) {
    this.source = source;
    this.schedulers = schedulers;
}

@Override
protected void subscribeActual(Observer observer) {
    schedulers.scheduleDirect(new SchedulerTask(observer));
}

private class SchedulerTask implements Runnable{
    final Observer observer;
    public SchedulerTask(Observer observer) {
        this.observer = observer;
    }

    @Override
    public void run() {
        // 线程池最终回来执行 Runnable -> 这行代码,会执行上游的 subscribe()
        // 而这个run方法在子线程中
        source.subscribe(observer);
    }
}

Schedulers 类

public abstract class Schedulers {
static Schedulers IO;
static {
    IO = new IOSchedulers();
}

public static Schedulers io() {
    return IO;
}

public abstract void scheduleDirect(Runnable runnable);

private static class IOSchedulers extends Schedulers {
    ExecutorService service;
    public IOSchedulers(){
        service = Executors.newScheduledThreadPool(1, new ThreadFactory() {
            @Override
            public Thread newThread(@NonNull Runnable r) {
                return new Thread(r);
            }
        });
    }

    @Override
    public void scheduleDirect(Runnable runnable) {
        service.execute(runnable);
    }
}
}

四、主线程实现

Observable中

  public Observable observerOn(Schedulers schedulers) {
    return onAssembly(new ObserverOnObservable(this,schedulers));
}

ObserverOnObservable

class ObserverOnObservable extends Observable {
final Observable source;
final Schedulers schedulers;
public ObserverOnObservable(Observable source, Schedulers schedulers) {
    this.source = source;
    this.schedulers = schedulers;
}

@Override
protected void subscribeActual(Observer observer) {
    source.subscribe(new ObserverOnObserver(observer,schedulers));
}

private class ObserverOnObserver implements Observer,Runnable{
    final Observer observer;
    final Schedulers schedulers;
    private T value;
    public ObserverOnObserver(Observer observer, Schedulers schedulers) {
        this.observer = observer;
        this.schedulers = schedulers;
    }

    @Override
    public void onSubscribe() {
        observer.onSubscribe();
    }

    @Override
    public void onNext(@NonNull T item) {
        value = item;
        schedulers.scheduleDirect(this);

    }

    @Override
    public void onError(@NonNull Throwable e) {
        observer.onError(e);
    }

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

    @Override
    public void run() {
        // 主线程 或者 其他
        observer.onNext(value);
    }
}

}
完善Schedulers

public abstract class Schedulers {
static Schedulers MAIN_THREAD;
static Schedulers IO;
static {
    IO = new IOSchedulers();
    MAIN_THREAD = new MainSchedulers(new Handler(Looper.getMainLooper()));
}

public static Schedulers io() {
    return IO;
}

public abstract void scheduleDirect(Runnable runnable);

public static Schedulers mainThread() {
    return MAIN_THREAD;
}

private static class IOSchedulers extends Schedulers {
    ExecutorService service;
    public IOSchedulers(){
        service = Executors.newScheduledThreadPool(1, new ThreadFactory() {
            @Override
            public Thread newThread(@NonNull Runnable r) {
                return new Thread(r);
            }
        });
    }

    @Override
    public void scheduleDirect(Runnable runnable) {
        service.execute(runnable);
    }
}

private static class MainSchedulers extends Schedulers {
    private Handler handler;
    public MainSchedulers(Handler handler) {
        this.handler = handler;
    }

    @Override
    public void scheduleDirect(Runnable runnable) {
        Message message = Message.obtain(handler,runnable);
        handler.sendMessage(message);
    }
}

你可能感兴趣的:(RxJava源码(二))