国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

RxBus的實現和使用

2019-11-06 09:56:31
字體:
來源:轉載
供稿:網友

RxBus并不是一個庫,而是一種模式。相信大多數開發者都使用過EventBus,作為事件總線通信庫,如果你的項目已經加入Rxjava和EventBus,不妨用RxBus代替EventBus,以減少庫的依賴。

一、添加RxJava和RxAndroid依賴

    //RxJava and RxAndroid    compile 'io.reactivex:rxandroid:1.1.0'    compile 'io.reactivex:rxjava:1.1.0'

二、新建RxBus類

不多說直接上代碼:

import rx.Observable;import rx.subjects.PublishSubject;import rx.subjects.SerializedSubject;import rx.subjects.Subject;/** * Created by ywh on 2017/2/8 */public class RxBus {    PRivate static volatile RxBus mInstance;  private final Subject bus;    public RxBus()    {        bus = new SerializedSubject<>(PublishSubject.create());    }    /**     * 單例模式RxBus     *     * @return     */    public static RxBus getInstance()    {        RxBus rxBus2 = mInstance;        if (mInstance == null)        {            synchronized (RxBus.class)            {                rxBus2 = mInstance;                if (mInstance == null)                {                    rxBus2 = new RxBus();                    mInstance = rxBus2;                }            }        }        return rxBus2;    }    /**     * 發送消息     *     * @param object     */    public void post(Object object)    {        bus.onNext(object);    }    /**     * 接收消息     *     * @param eventType     * @param <T>     * @return     */    public <T> Observable<T> toObserverable(Class<T> eventType)    {        return bus.ofType(eventType);    }}

1、Subject同時充當了Observer和Observable的角色,Subject是非線程安全的,要避免該問題,需要將 Subject轉換為一個SerializedSubject,上述RxBus類中把線程非安全的PublishSubject包裝成線程安全的Subject。2、PublishSubject只會把在訂閱發生的時間點之后來自原始Observable的數據發射給觀察者。3、ofType操作符只發射指定類型的數據,其內部就是filter+cast

三、創建你需要發送的事件類

我們這里用StudentEvent舉例

/** * Created by ywh on 2017/2/8 */public class StudentEvent {    private String id;    private String name;    public StudentEvent(String id, String name) {        this.id = id;        this.name = name;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

四、發送事件

RxBus.getInstance().post(new StudentEvent("007","小明"));

五、接收事件

rxSbscription=RxBus.getInstance().toObserverable(StudentEvent.class)                .subscribe(new Action1<StudentEvent>() {                    @Override                    public void call(StudentEvent studentEvent) {                        textView.setText("id:"+ studentEvent.getId()+"  name:"+ studentEvent.getName());                    }                });

注:rxSbscription是Sbscription的對象,我們這里把RxBus.getInstance().toObserverable(StudentEvent.class)賦值給rxSbscription以方便生命周期結束時取消訂閱事件

六、取消訂閱

@Override    protected void onDestroy() {        if (!rxSbscription.isUnsubscribed()){            rxSbscription.unsubscribe();        }        super.onDestroy();    }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵川县| 会宁县| 凤庆县| 河北省| 南充市| 宝山区| 玉屏| 镶黄旗| 松潘县| 会泽县| 景谷| 台江县| 惠来县| 九江市| 南平市| 四平市| 库伦旗| 灵寿县| 沂南县| 邵武市| 绥宁县| 旬邑县| 仁化县| 晋城| 舒城县| 甘南县| 云和县| 张家界市| 青铜峡市| 平顶山市| 霞浦县| 奉贤区| 留坝县| 汕头市| 彩票| 平罗县| 内黄县| 日土县| 威远县| 沾化县| 顺昌县|