美文网首页
RxJava超简单实现EventBus基本功能

RxJava超简单实现EventBus基本功能

作者: itfitness | 来源:发表于2019-06-17 13:49 被阅读0次

    目录

    目录

    前言

    身为Android开发大家都应该熟悉EventBus这款开源库,但是有时候我们往往只需要EventBus的基本功能不需要其他多余的功能怎么办呢?如果这时你的项目刚好使用的RxJava那么你就有福了,完全可以通过极少的代码来实现EventBus的基本功能。

    效果展示

    演示的主要是在第二个界面发送事件给第一个界面然后并展示出来


    实现原理

    这里使用的是RxJava里的Subject,我们从它的源码可以看出它既是Observable同时也是Observer,正好可以作为两者之间沟通的桥梁,同时这里也使用了PublishSubject.create<Any>().toSerialized()来生成Subject这样可以保证线程安全。


    实现步骤

    1.编写RxBus类
    这里使用Kotlin进行编写可以极大简化代码

    object RxBus {
        private var mBus:Subject<Any> = PublishSubject.create<Any>().toSerialized()//保证线程安全
        fun post(any: Any){
            mBus.onNext(any)
        }
        /**
         * 过滤信息,此方法生成的Observable只对指定类型进行监听
         */
        fun <T> toObservable(clazz:Class<T>):Observable<T>{
            return mBus.ofType(clazz)
        }
        /**
         * 不过滤信息,监听任何类型的消息
         */
        fun toObservable():Observable<Any>{
            return mBus
        }
    }
    

    2.编写RxEvent类(用于事件传递)

    class RxEvent(private var msg: String) {
        fun getMsg():String{
            return msg
        }
    }
    

    3.在第一个Activity中进行监听

    class MainActivity : AppCompatActivity() {
        private lateinit var disposable:Disposable
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            //进行监听
            disposable = RxBus.toObservable(RxEvent::class.java)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe({
                        main_tv.text = it.getMsg()
                    })
            main_bt.setOnClickListener {
                startActivity(Intent(this@MainActivity,SecondActivity::class.java))
            }
        }
    
        override fun onDestroy() {
            super.onDestroy()
            //取消监听
            if(!disposable.isDisposed){
                disposable.dispose()
            }
        }
    }
    

    4.在第二个Activity中进行事件发送

    class SecondActivity:AppCompatActivity (){
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_second)
            second_bt.setOnClickListener {
                RxBus.post(RxEvent("我是第二界面的信息"))
            }
        }
    }
    

    两个Activity的布局文件如下:

    • activity_main.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.itfitness.rxbusdemo.MainActivity">
        <Button
            android:id="@+id/main_bt"
            android:text="第二界面"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/main_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    
    </LinearLayout>
    
    • activity_second.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/second_bt"
            android:text="发送"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

    拓展:使RxBus支持背压

    由于在RxJava2.x中Subject已经不支持背压了,因此如果想支持背压可以将Subject换成PublishProcessor。

    object RxBus {
        private var mBus:FlowableProcessor<Any> = PublishProcessor.create<Any>().toSerialized()//保证线程安全
        fun post(any: Any){
            mBus.onNext(any)
        }
        /**
         * 过滤信息,此方法生成的Observable只对指定类型进行监听
         */
        fun <T> toObservable(clazz:Class<T>):Flowable<T>{
            return mBus.ofType(clazz)
        }
        /**
         * 不过滤信息,监听任何类型的消息
         */
        fun toObservable():Flowable<Any>{
            return mBus
        }
    }

    相关文章

      网友评论

          本文标题:RxJava超简单实现EventBus基本功能

          本文链接:https://www.haomeiwen.com/subject/lltafctx.html