RxBus

来源:互联网 发布:河西学院网络教学平台 编辑:程序博客网 时间:2024/06/05 07:07

自定义了一个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;        }    }}



0 0
原创粉丝点击