1+ package com.android.freddie.rxbus
2+
3+ import android.os.Bundle
4+ import android.util.SparseArray
5+ import io.reactivex.disposables.CompositeDisposable
6+ import io.reactivex.subjects.PublishSubject
7+
8+ class RxBus {
9+ companion object {
10+ private val subjectMap: SparseArray <PublishSubject <Any >> = SparseArray ()
11+ private val subscriptionMap: MutableMap <Any , CompositeDisposable > = mutableMapOf ()
12+
13+ private fun getSubject (subjectCode : Int ): PublishSubject <Any > {
14+ var subject = subjectMap.get(subjectCode)
15+ if (subject == null ) {
16+ subject = PublishSubject .create<Any >()
17+ subjectMap.put(subjectCode, subject)
18+ }
19+ return subject
20+ }
21+
22+ private fun getCompositeDisposable (obj : Any ): CompositeDisposable {
23+ var compositeDisposable = subscriptionMap[obj]
24+ if (compositeDisposable == null ) {
25+ compositeDisposable = CompositeDisposable ()
26+ subscriptionMap[obj] = compositeDisposable
27+ }
28+
29+ return compositeDisposable
30+ }
31+
32+ fun subscribe (subject : Int , lifecycle : Any , action : (Any ) -> Unit ) {
33+ val disposable = getSubject(subject).subscribe(action)
34+ getCompositeDisposable(lifecycle).add(disposable)
35+ }
36+
37+ fun unregister (lifecycle : Any ) {
38+ val compositeDisposable = subscriptionMap.remove(lifecycle)
39+ compositeDisposable?.dispose()
40+ }
41+
42+ fun publish (subject : Int , message : Any? = null) {
43+ val sbj = getSubject(subject)
44+ if (message == null ) {
45+ val bundle = Bundle ()
46+ sbj.onNext(bundle)
47+ } else {
48+ sbj.onNext(message)
49+ }
50+ }
51+ }
52+ }
0 commit comments