android之使用RxJava實現EventBus事件總線

1.引入依賴

//rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

2.RxBus代碼

/**
 * 用RxJava實現EventBus
 */
public class RxBus {
    private static RxBus instance;
    private ConcurrentHashMap<Object,List<Subject>> subjectMapper=new ConcurrentHashMap<>();

    public static synchronized RxBus getInstance(){
        if (instance==null){
            instance=new RxBus();
        }
        return instance;
    }

    private RxBus(){}

    /**
     * 訂閱事件源
     */
    public RxBus onEvent(Observable<?> mObservable, Consumer<Object> mAction1){
        mObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                throwable.printStackTrace();
            }
        });
        return getInstance();
    }

    /**
     * 註冊事件源
     */
    public <T> Observable<T> register(@NonNull Object tag){
        List<Subject> subjectList=subjectMapper.get(tag);
        if (subjectList==null){
            subjectList=new ArrayList<Subject>();
            subjectMapper.put(tag,subjectList);
        }
        Subject<T> subject;
        subjectList.add(subject=PublishSubject.<T>create());
        return subject;
    }

    public void unregister(@NonNull Object tag){
        List<Subject> subjects=subjectMapper.get(tag);
        if (subjects!=null){
            subjectMapper.remove(tag);
        }
    }

    /**
     * 取消監聽
     */
    public RxBus unregister(@NonNull Object tag,@NonNull Observable<?> observable){
        if (observable==null){
            return getInstance();
        }
        List<Subject> subjects=subjectMapper.get(tag);
        if (subjects!=null){
            subjects.remove(observable);
            if (isEmpty(subjects)){
                subjectMapper.remove(tag);
            }
        }
        return getInstance();
    }

    public void post(@NonNull Object content){
        post(content.getClass().getName(),content);
    }

    /**
     * 觸發事件
     */
    public void post(@NonNull Object tag,@NonNull Object content){
        List<Subject> subjectList=subjectMapper.get(tag);
        if (!isEmpty(subjectList)){
            for (Subject subject:subjectList){
                subject.onNext(content);
            }
        }
    }

    public static boolean isEmpty(Collection<Subject> collection){
        return collection==null||collection.isEmpty();
    }
}

3.RxManager代碼

/**
 * 用於管理單個presenter的RxBus的事件和RxJava相關代碼的生命週期處理
 */
public class RxManager {
    public RxBus mRxBus=RxBus.getInstance();
    //管理rxbus訂閱
    private Map<String,Observable<?>> mObservables=new HashMap<>();
    //管理Observables和Subscribers訂閱
    private CompositeDisposable mCompositeDisposable=new CompositeDisposable();
    /**
     * RxBus注入監聽
     */
    public <T> void on(String eventName, Consumer<T> action1){
        Observable<T> mObservable=mRxBus.register(eventName);
        mObservables.put(eventName,mObservable);
        Disposable subscription=mObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(action1, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                    }
                });
        //訂閱管理
        mCompositeDisposable.add(subscription);
    }

    /**
     * 單純的Observables 和 Subscribers管理
     */
    public void add(Disposable m){
        //訂閱管理
        mCompositeDisposable.add(m);
    }

    /**
     * 單個presenter生命週期結束,取消訂閱和所有rxbus觀察
     */
    public void clear(){
        mCompositeDisposable.dispose();
        for (Map.Entry<String,Observable<?>> entry:mObservables.entrySet()){
            mRxBus.unregister(entry.getKey(),entry.getValue());// 移除rxbus觀察
        }
    }

    public void unregister(String tag){
        Observable<?> observable=mObservables.remove(tag);
        if (observable!=null){
            mRxBus.unregister(tag,observable);//移除rxbus觀察
        }
    }

    //發送rxbus
    public void post(Object tag,Object content){
        mRxBus.post(tag,content);
    }
}

4.消息類別

public class Constants {
    //event bus
    public static final String SEDN_MESSAGE = "send message";
}

5.BaseActivity

public abstract class BaseActivity extends AppCompatActivity {
    public RxManager mRxManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRxManager=new RxManager();
        setContentView(getLayoutId());
        initPresenter();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRxManager.clear();
    }

    /*********************
     * 子類實現
     *****************************/
    //簡單頁面無需mvp就不用管此方法即可,完美兼容各種實際場景的變通
    public abstract void initPresenter();

    //獲取佈局文件
    public abstract int getLayoutId();
}

6.使用方法(可發送對象和任何數據類型)

public class EventMsg {
    public String msg;
    public int year;
}


//發送消息
EventMsg eventMsg=new EventMsg();
eventMsg.msg="淡泊以明志,寧靜以致遠";
eventMsg.year=3;
mRxManager.post(Constants.SEDN_MESSAGE,eventMsg);


//在返回的ac中接收消息
mRxManager.on(Constants.SEDN_MESSAGE, new Consumer<Object>() {
      @Override
      public void accept(Object o) throws Exception {
           EventMsg eventMsg= (EventMsg) o;
           tv_text.setText(eventMsg.msg+eventMsg.year);
      }
});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章