xml地图|网站地图|网站标签 [设为首页] [加入收藏]

事件总线实现,稳如老狗

来源:http://www.ccidsi.com 作者:集成介绍 人气:62 发布时间:2020-03-15
摘要:logo 简介 昂CoraxBus 是基于 LacrossexJava完毕的平地风波总线方式,他的精锐之处是代码超少可是效果却并不轻松。最简便易行的GL450xBus 达成仅仅必要二十几行代码,相较之下 伊夫ntBus显得

图片 1logo

简介

昂CoraxBus 是基于 LacrossexJava 完毕的平地风波总线方式,他的精锐之处是代码超少可是效果却并不轻松。最简便易行的 GL450xBus 达成仅仅必要二十几行代码,相较之下 伊夫ntBus 显得微微丰腴。正因为强盛的 凯雷德xBus ,Android 开源界的人心企业 Square 公司终止了保卫安全他们的平地风波总线库 奥托而且在 github 项目主页上为 RAV4xBus 投了一张推荐票:

Deprecated!
This project is deprecated in favor of RxJava and RxAndroid. These projects permit the same event-driven programming model as Otto, but they’re more capable and offer better control of threading.
If you’re looking for guidance on migrating from Otto to Rx, this post is a good start.
该项目已被大切诺基xJava和PAJEROxAndroid代替。本田CR-Vx类项目允许与奥托相符的事件驱动编制程序模型,并且技巧更加强,操作线程更方便。
假定你正在索求从奥托迁移到奇骏x的点拨,这些帖子是个很好的初叶。

在引进 KugaxJava 和 奥迪Q7xAndroid 库的前提下 TucsonxBus 的得以达成仅仅必要几十行代码的多个类,在越来越多的开荒者趋向于接纳 奥迪Q3xAndroid

  • Retrofit 达成互连网央求框架的前些天,CR-VxBus 成为对应的平地风波总线落成方式也据理力争,没供给再为了时刻总线单独再引入一个库进而扩大应用体积,当然假设项目已经涉足 伊夫ntBus 作为事件总线库,这就得和煦衡量切换开支了。

EvoquexBus、伊芙ntBus因为解耦太干净,滥用的话,项目可维护性会越来越低;一些简短场景更推荐用回调、Subject来顶替事件总线。

实则接收状况,就算CR-VxBus,EventBus二选一,笔者更赞成于选择伊芙ntBus, 奇骏xJava潜心职业流,EventBus潜心事件总线,职务更显明

![rb][rbsvg] ![License][licensesvg]

实践

卡宴xJava 与 LacrossexJava2 在操作符和艺术上有了一些纠正,多少个版本的兑现情势上面都会讲到.

有段时日没更了,多少个月前,小编写过一篇完结轻便的中华VxBus小说: 用LANDxJava完成事件总线。

Gradle:

最简完毕

RxJava 1

public class RxBus {
    private static volatile RxBus defaultInstance;

    private final Subject<Object, Object> bus;
    // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
    public RxBus() {
        bus = new SerializedSubject<>(PublishSubject.create());
    }
    public static RxBus getDefault() {
        if (defaultInstance == null) {
            synchronized (RxBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new RxBus();
                }
            }
        }
        return defaultInstance ;
    }
    // 发送一个新的事件
    public void post (Object o) {
        bus.onNext(o);
    }
    // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
    public <T> Observable<T> toObservable (Class<T> eventType) {
        return bus.ofType(eventType);
    }
}

RxJava 2

public class RxBus {
    private static volatile RxBus defaultInstance;
    private final Subject<Object> bus;

    // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
    private RxBus() {
        bus = PublishSubject.create().toSerialized();
    }

    // 单例RxBus
    public static RxBus getDefault() {
        if (defaultInstance == null) {
            synchronized (RxBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new RxBus();
                }
            }
        }
        return defaultInstance;
    }

    // 发送一个新的事件,所有订阅此事件的订阅者都会收到
    public void post(Object action) {
        bus.onNext(action);
    }


    // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
    public <T> Observable<T> toObservable(Class<T> eventType) {
        return bus.ofType(eventType);
    }
}

安德拉xJava1 进级到 PRADOxJava2 只是初阶化形式发出了扭转,别之处维持不改变。

在实质上条件中,你会发现ENCORExBus仍有一部分题指标。

implementation "com.blankj:rxbus:1.1"

总结利用

RxJava 1

// 数据发送端
// data 为任意数据类型,以 Data 类型代表
RxBus.getDefault().post(data);

    .
    .
    .
// 数据接收端
    mSubscription = RxBus
        .getDefault()
        .toObservable(Data.class)
        .subscribe(new Action1<Data>()){
            @Override
            public void call(Data data){
                    // do something with data ...
            }
        }
    .
    .
    .
// 监听使用离开之后(如关闭监听所在界面)时记得解绑监听,避免引起内存泄漏
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
    mSubscription.unsubscribe();
 }

RxJava 2

// 数据发送端
// data 为任意数据类型,以 Data 类型代表
RxBus.getDefault().post(data);

private Disposable mDisposable;
    .
    .
    .
RxBus.getDefault()
        .toObservable(Data.class)
        //使用 subscribeWith 和 subscribe 都可以
        .subscribeWith(new Observer<Data>){
            @Override
            public void onSubscribe(Disposable d) {
                mDisposable = d;
            }

            @Override
            public void onNext(Data data) {
                // do something with data ...
            }

            @Override
            public void onError(Throwable e) {
                // do something with e ...
            }

            @Override
            public void onComplete() {

            }
        };
    .
    .
    .
if (mDisposable != null && !mDisposable.isDisposed()) {
                mDisposable.dispose();
}
  • 你需要RxBus支持Sticky功能。
  • 你会发今后你订阅了某些事件后,在三回九转选择到该事件时,管理的进度中发出了非常,你恐怕会发掘三番五次的风云都吸取不到了!

非粘性事件

  1. 登记事件
public class YourActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册 String 类型事件 RxBus.getDefault().subscribe(this, new RxBus.Callback<String>() { @Override public void onEvent { Log.e("eventTag", s); } }); // 注册带 tag 为 "my tag" 的 String 类型事件 RxBus.getDefault().subscribe(this, "my tag", new RxBus.Callback<String>() { @Override public void onEvent { Log.e("eventTag", s); } }); } @Override protected void onDestroy() { super.onDestroy(); // 注销 RxBus.getDefault().unregister; }}
  1. 发送事件
// 发送 String 类型事件RxBus.getDefault().post("without tag");// 发送带 tag 为 "my tag" 的 String 类型事件RxBus.getDefault().post("with tag", "my tag");

带 Code 封装

通过上边的粗略实用会发觉二个主题素材,每发送一个类都急需二个出殡和安葬对象类,采取的时候也急需传入该对象类。假使存在观察者 A、B、C 皆是登记了对 D.class 新闻选拔。即便那时候只想向 A 发送 D对象,那么就能够促成八个观看者都摄取那个新闻。那也违背了只想传给 A 观望者的初心。因而笔者的主张是为各个发送对象在加多一个发送 Code 当 Code 和 class 都满意时观看者才会接纳管理新闻,那样一旦急需布告八个阅览者那么寓目者注册时利用同一的 Code 就能够。

作者将分2篇文章分别交付其方案,那篇介绍怎么样贯彻Sticky,此外一篇介绍WranglerxBus中的万分管理方案:
深切TiguanxBus:[万分管理]

本文由68399皇家赌场发布于集成介绍,转载请注明出处:事件总线实现,稳如老狗

关键词: 68399皇家赌场 Android知识 Android... RxBus 稳如老狗

上一篇:年龄识别,图像检索经典论文解读

下一篇:没有了

最火资讯