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;
        }
    }

}




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

EventBus 3.0注解式使用方法

  • 2017年02月20日 15:36
  • 12.55MB
  • 下载

RxBus(一)

最近在整理项目源码中,打算抽取一些常用的代码,做成属于自己的项目代码库,以供其他项目或者以后做项目使用,减少重复工作,降低开发难度。     如果已经在项目中使用了RxJava,可以考虑RxBus来...
  • u012491617
  • u012491617
  • 2017年01月22日 13:10
  • 197

RxBus完全一样的 EventBus

rxbus背景是否有这样的纠结:已经使用rxjava和rxAndroid到你的项目中,但是项目中又同时存在eventbus;因为rx完全可以替换掉eventbus所以导致了过多引入第三方jar包的问题...
  • u014610664
  • u014610664
  • 2016年09月29日 13:51
  • 19217

安卓广播升级 RxBus的实现及简单使用

RxBus并不是一个库,是利用RxJava的特性构建的一种数据传递的工具模式。相信大多数开发者都使用过EventBus,作为事件总线通信库,如果你的项目已经加入RxJava和EventBus,不妨用R...
  • qq_34161388
  • qq_34161388
  • 2017年06月08日 11:25
  • 841

基于注释处理生成代码的RxBus[Deprecated!]

Android RxBus该项目基于RxJava2 & RxAndroid,并且从AndroidKnife/RxBus中学习而实现的。使用annotation processing(注释处理)自动生成...
  • vite_s
  • vite_s
  • 2017年03月28日 12:25
  • 404

EventBus,RxBus相关介绍

eventBus是一个主要用于事件的发布和订阅的框架,是一个发布 / 订阅的事件总线,包含4部分:发布者,订阅者,事件,总线。RxBus是一种开发思想,使用了观察者模式的RxJava,RxAndroi...
  • dzsw0117
  • dzsw0117
  • 2016年05月01日 16:41
  • 1284

RXBUS的简单使用

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

一个简单的、结合注解使用的RxBus

网上有许多实现简单的RxBus,不过思来想去,还是自己写一个用得顺手。最核心的内容依然是用RxJava中的Subject。只是通过注解修饰事件处理,简化了调用步骤。项目地址:ViTess/RxBusA...
  • vite_s
  • vite_s
  • 2016年11月22日 20:51
  • 1443

RxBus在rxjava2.0 的使用

RxBus在rxjava2.0 的使用
  • u011271348
  • u011271348
  • 2017年04月10日 14:18
  • 4456

使用和配置RxBus

在安卓项目中,传递消息是使用率比较频繁的,我们除了Intent或者Bundle还可以选择使用框架传递消息,框架其实已经封装好并且处理好消息传递,线程使用的,我们只需要直接使用就可以了,那么框架传递消息...
  • n86223830
  • n86223830
  • 2016年09月27日 20:40
  • 624
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RxBus
举报原因:
原因补充:

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