android自定义rx库,RxJava漫谈-RxAndroid使用

RxJava在github上的地址:外链网址已屏蔽

RxAndroid在github上的地址:外链网址已屏蔽

本文主要介绍RxAndroid的使用,如果对于RxJava还不熟悉的可以先看一下RxJava的介绍文章。

Android的程序是用Java书写的,Android也有一些自己的线程模型,例如AsyncTask和Handler等。RxJava正是结合了前面的这几项,在此基础上推出了RxAndroid。下面介绍使用。

首先,我们在项目中引入RxAndroid,主要是在gradle脚本中引入下面两句话即可。

dependencies {

compile fileTree(dir:'libs', include: ['*.jar'])

testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.1.1'compile'com.android.support:design:23.1.1'

//引入RxAndroid----begin

compile 'io.reactivex:rxandroid:1.1.0'compile'io.reactivex:rxjava:1.1.0'

//引入RxAndroid----end

}

这样就可以在Android代码中使用RxAndroid了,下面的例子展示了一段使用RxAndroid书写的代码:

Observable.just("one", "two", "three", "four", "five")

.subscribeOn(Schedulers.newThread())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(/*an Observer*/);

这一段代码是在RxAndroid的官网上写的一段示例的代码。这里可以看出来,与RxJava相比较,其主要增加了如下的几个java文件:

AndroidSchedulers

BuildConfig

HandlerScheduler

MainThreadSubscription

RxAndroidPlugins

RxAndroidSchedulersHook

下面分别对这几个文件的源码看一下:

1.AndroidSchedulers类的源码

public final classAndroidSchedulers {privateAndroidSchedulers() {throw new AssertionError("No instances");

}private static classMainThreadSchedulerHolder {static final Scheduler MAIN_THREAD_SCHEDULER =

new HandlerScheduler(newHandler(Looper.getMainLooper()));

}public staticScheduler mainThread() {

Scheduler scheduler=RxAndroidPlugins.getInstance().getSchedulersHook().getMainThreadScheduler();return scheduler != null ?scheduler : MainThreadSchedulerHolder.MAIN_THREAD_SCHEDULER;

}

}

这个类主要提供了MainThread调度器,在RxAndroid中需要在主线程中处理的食物都需要用到这个类的mainThread。

2.BuildConfig类的源码:

public final classBuildConfig {public static final boolean DEBUG = false;public static final String APPLICATION_ID = "rx.android";public static final String BUILD_TYPE = "release";public static final String FLAVOR = "";public static final int VERSION_CODE = -1;public static final String VERSION_NAME = "";

}

主要是一些常量配置。

3.HandlerScheduler类的源码:

public final class HandlerScheduler extendsScheduler {public staticHandlerScheduler from(Handler handler) { //从一个Handler中创建一个Schedulerif (handler == null) throw new NullPointerException("handler == null");return newHandlerScheduler(handler);

}private finalHandler handler;

HandlerScheduler(Handler handler) {this.handler =handler;

}

@OverridepublicWorker createWorker() {//覆盖Scheduler的createWorker函数,创建基于Handler的Workerreturn newHandlerWorker(handler);

}static class HandlerWorker extendsWorker {private finalHandler handler;private final CompositeSubscription compositeSubscription = newCompositeSubscription();

HandlerWorker(Handler handler) {this.handler =handler;

}

@Overridepublic voidunsubscribe() {

compositeSubscription.unsubscribe();

}

@Overridepublic booleanisUnsubscribed() {returncompositeSubscription.isUnsubscribed();

}

@Overridepublic Subscription schedule(Action0 action, longdelayTime, TimeUnit unit) {//覆盖Worker的调度函数scheduleif(compositeSubscription.isUnsubscribed()) {returnSubscriptions.unsubscribed();

}

action=RxAndroidPlugins.getInstance().getSchedulersHook().onSchedule(action);final ScheduledAction scheduledAction = newScheduledAction(action);

scheduledAction.addParent(compositeSubscription);

compositeSubscription.add(scheduledAction);

handler.postDelayed(scheduledAction, unit.toMillis(delayTime));//使用Handler处理这个调度动作ScheduleAction

scheduledAction.add(Subscriptions.create(newAction0() {

@Overridepublic voidcall() {

handler.removeCallbacks(scheduledAction);//这句话保证当调度动作被取消的时候,能够及时把这个action从Handler中移除

}

}));returnscheduledAction;

}

@Overridepublic Subscription schedule(finalAction0 action) {return schedule(action, 0, TimeUnit.MILLISECONDS);

}

}

}

HandlerScheduler 类就是使用Handler作为处理核心的Scheduler类。

4.MainThreadSubscription类的源码:

public abstract class MainThreadSubscription implementsSubscription {public static voidverifyMainThread() { //静态方法,判断当前线程是否是主线程if (Looper.myLooper() !=Looper.getMainLooper()) {throw newIllegalStateException("Expected to be called on the main thread but was " +Thread.currentThread().getName());

}

}private final AtomicBoolean unsubscribed = newAtomicBoolean();

@Overridepublic final booleanisUnsubscribed() {returnunsubscribed.get();

}

@Overridepublic final voidunsubscribe() {//主线程的取消订阅if (pareAndSet(false, true)) {if (Looper.myLooper() ==Looper.getMainLooper()) {//如果是主线程直接进行

onUnsubscribe();

}else{

AndroidSchedulers.mainThread().createWorker().schedule(newAction0() {//如果不是主线程,就创建创建一个Action放到主线程中去执行

@Overridepublic voidcall() {

onUnsubscribe();

}

});

}

}

}protected abstract voidonUnsubscribe();

}

MainThreadSubscription类主要在意的就是unsubscribe的执行线程,这里采取一切方式保证其在主线程中执行。

5.RxAndroidPlugins类的源码:

public final classRxAndroidPlugins {//这个类的主要作用就是维护了一个RxAndroidSchedulersHookprivate static final RxAndroidPlugins INSTANCE = newRxAndroidPlugins();public staticRxAndroidPlugins getInstance() {returnINSTANCE;

}private final AtomicReference schedulersHook =

new AtomicReference();

RxAndroidPlugins() {

}

@Betapublic voidreset() {

schedulersHook.set(null);

}publicRxAndroidSchedulersHook getSchedulersHook() {if (schedulersHook.get() == null) {

pareAndSet(null, RxAndroidSchedulersHook.getDefaultInstance());//如果原来是null,就设置一个RxAndroidSchedulersHook//We don't return from here but call get() again in case of thread-race so the winner will//always get returned.

}returnschedulersHook.get();

}public voidregisterSchedulersHook(RxAndroidSchedulersHook impl) {if (!pareAndSet(null, impl)) {//如果原来的RxAndroidSchedulerHook是空,则直接持有,否则抛出异常throw newIllegalStateException("Another strategy was already registered: " +schedulersHook.get());

}

}

}

可以看出RxAndroidSchedulerHook必须在使用前注册,一旦使用就不能再注册了。

6.RxAndroidSchedulersHook类的源码:

public classRxAndroidSchedulersHook {private static final RxAndroidSchedulersHook DEFAULT_INSTANCE = newRxAndroidSchedulersHook();public staticRxAndroidSchedulersHook getDefaultInstance() {returnDEFAULT_INSTANCE;

}publicScheduler getMainThreadScheduler() {return null;

}publicAction0 onSchedule(Action0 action) {returnaction;

}

}

这是RxAndroid提供的一个默认的RxAndroidSchedulerHook类,程序员也可以自己定义一个这样的类注册到RxAndroidPlugins中,但是必须在使用RxAndroidPlugins之前注册。

自定义的RxAndroidSchedulerHook类可以覆盖onSchedule函数,在这里进行一些处理,例如日志记录等。

以上只是说明了RxAndroid与RxJava中不一样的地方,并没有尝试说明RxJava是什么,在阅读本文之前,读者应该先弄明白这个问题。

现在再来看之前的两个例子就很明白了:

public class ReactiveFragment extends Fragment {//在UI线程中的例子

@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

Observable.just("one", "two", "three", "four", "five")

.subscribeOn(Schedulers.newThread())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(/*an Observer*/);

}

new Thread(new Runnable() {//在其他线程中的例子

@Overridepublic voidrun() {final Handler handler = new Handler(); //绑定到这个线程的Handler

Observable.just("one", "two", "three", "four", "five")

.subscribeOn(Schedulers.newThread())

.observeOn(HandlerScheduler.from(handler))

.subscribe(/*an Observer*/)//perform work, ...

}

},"custom-thread-1").start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值