RxBus

原创 2017年01月03日 15:18:52

自定义了一个RxBus记录一下,以免以后难得找。记录如下:

package com.han.dlnaplayercontroller.rxbus;

import com.trello.rxlifecycle.ActivityEvent;
import com.trello.rxlifecycle.FragmentEvent;
import com.trello.rxlifecycle.components.ActivityLifecycleProvider;
import com.trello.rxlifecycle.components.FragmentLifecycleProvider;

import rx.Observable;
import rx.Subscription;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
import rx.subscriptions.CompositeSubscription;

/**
 * Created by tlh on 2017/1/3.
 */

public class RxBus {

    private static RxBus instance;
    //为了防止内存泄露在完成任务后需要进行退订阅操作类,继承自Subscription
    private static CompositeSubscription mCompositeSubscription;
    //PublishSubject:源码中你会发现PublishSubjet继承抽象类Subject,Subject而又继承了Observable,实现了Observer
    //所以可以说PublishSubject既是Observable,又是Observer。意思就是说既可以发送信息又可以接收信息
    private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.<Object>create());

    //构造方法私有化
    private RxBus() {

    }

    //实例化RxBus
    public static RxBus getInstance() {
        if (instance == null)
            synchronized (RxBus.class) {
                if (instance == null)
                    instance = new RxBus();
                mCompositeSubscription = new CompositeSubscription();
            }
        return instance;
    }

    //发送事件的
    public void send(Object o) {
        _bus.onNext(o);
    }


    private Observable<Object> toObservable() {
        return _bus;
    }

    //判断是否存在订阅关系
    private boolean hasObservers() {
        return _bus.hasObservers();
    }

    //用于接收事件的函数函数,可以过滤掉不想接收的事件
    public void receive(Func1<Object, Boolean> func1, Action1<Object> onNext, Action1<Throwable> onError, Action0 onCompleted) {
        mCompositeSubscription.add(RxBus.getInstance().toObservable().filter(func1).subscribe(onNext, onError == null ? new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                throwable.printStackTrace();
            }
        } : onError, onCompleted));

    }

    //退订阅操作接口方法
    public void unsubscribe() {
        if (instance.hasObservers() && mCompositeSubscription.isUnsubscribed())
            mCompositeSubscription.unsubscribe();
    }

    //---------------强大的分割线,下面是Rxjava和Activity以及Fragment生命周期邦定有关的-------------------------//
    public static SubscriberBuilder with(FragmentLifecycleProvider fragmentLifecycleProvider) {
        return new SubscriberBuilder(fragmentLifecycleProvider);
    }

    public static SubscriberBuilder with(ActivityLifecycleProvider activityLifecycleProvider) {
        return new SubscriberBuilder(activityLifecycleProvider);
    }

    public static class SubscriberBuilder {

        private FragmentLifecycleProvider mFragLifecycleProvider;
        private ActivityLifecycleProvider mActLifecycleProvider;
        private FragmentEvent mFragmentEndEvent;
        private ActivityEvent mActivityEndEvent;
        private int what;

        public SubscriberBuilder(FragmentLifecycleProvider provider) {
            this.mFragLifecycleProvider = provider;
        }

        public SubscriberBuilder(ActivityLifecycleProvider provider) {
            this.mActLifecycleProvider = provider;
        }

        public SubscriberBuilder what(int what) {
            this.what = what;
            return this;
        }

        public SubscriberBuilder stopEvent(FragmentEvent event) {
            this.mFragmentEndEvent = event;
            return this;
        }

        public SubscriberBuilder stopEvent(ActivityEvent event) {
            this.mActivityEndEvent = event;
            return this;
        }


        public Subscription receive(Action1<? super Object> onNext, Action1<Throwable> onError) {
            if (mFragLifecycleProvider != null) {
                return RxBus.getInstance().toObservable()
                        .compose(mFragmentEndEvent == null ? mFragLifecycleProvider.<Object>bindToLifecycle() : mFragLifecycleProvider.<Object>bindUntilEvent(mFragmentEndEvent)) // 绑定生命周期
                        //过滤 根据code判断返回事件
                        .subscribe(onNext, onError == null ? new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                throwable.printStackTrace();
                            }
                        } : onError);
            }
            if (mActLifecycleProvider != null) {
                return RxBus.getInstance().toObservable()
                        .compose(mActivityEndEvent == null ? mActLifecycleProvider.<Object>bindToLifecycle() : mActLifecycleProvider.<Object>bindUntilEvent(mActivityEndEvent))

                        .subscribe(onNext, onError == null ? new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                throwable.printStackTrace();
                            }
                        } : onError);
            }

            return null;
        }
    }

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Rxlifecycle使用详解,解决RxJava内存泄露问题

随着Android第三库的普及, RxJava 和 RxAndroid ( https://github.com/ReactiveX/RxAndroid )越来越被人熟知,简洁的语法,配合Java8 ...

RXBUS

简单的实现一下RXBUS的思想在我的理解里面,RXBUS可以理解为就像乘公交车一样,上车然后到达目的地下车。在代码里面可以理解为发送一个被观察者到集合然后根据类型来决定是否订阅。和公交的上车下车目的几...

[深入RxBus]:异常处理

在实际环境中,你会发现RxBus还是有一些问题的。你需要RxBus支持Sticky功能。 你会发现在你订阅了某个事件后,在后续接收到该事件时,处理的过程中发生了异常,你可能会发现后续的事件都接收不到了...

[深入RxBus]:支持Sticky事件

在实际环境中,你会发现RxBus还是有一些问题的。你需要RxBus支持Sticky功能。你会发现在你订阅了某个事件后,在后续接收到该事件时,处理的过程中发生了异常,你可能会发现后续的事件都接收不到了!...

RxAndroid 应用(三)(简易天气App之Observable内存泄露)

在我们的Handler使用不当会发生内存泄露,那么Observable会不会发生持有context而导致内存泄露呢?答案是肯定的,接下来就来看看怎样避免。 public class RxUtils {...

RXBUS的简单使用

RxBus是用来进行组件之间通讯的。因为项目当中用到了RxJava,因此用RxBus来实现组件之间的通讯,相对来说比较方便。关于RxBus的介绍和其他组件通讯工具EventBus可参考下面链接: 用...

RxBus 简单使用学习

最近需要重构项目,准备用EventBus,后来想了想还是用新的技术比较好点,所以用了RxBus ,但是我这里用的是RxBus2,RxBus2的用法跟RxBus的用法不一样,改了很多地方,大家可以在网上...

RxBus使用示例

首先导入rxjava,rxAndroid,rxlifecyclecompile 'io.reactivex:rxandroid:latest.release' compile 'io.reactive...

Android RxBus

  • 2016年08月02日 22:10
  • 28.45MB
  • 下载

基于Rxjava2的事件总线:Rxbus

  • 2017年09月01日 11:43
  • 25.88MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxBus
举报原因:
原因补充:

(最多只允许输入30个字)