Skip to content

Commit d21cc96

Browse files
committed
perf: improve event bus performance
Signed-off-by: Kyle Corry <kylecorry31@gmail.com>
1 parent 07db43a commit d21cc96

2 files changed

Lines changed: 36 additions & 17 deletions

File tree

  • app/src/main/java/com/kylecorry/trail_sense
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.kylecorry.trail_sense.shared.andromeda_temp
2+
3+
import com.kylecorry.luna.subscriptions.generic.Subscription
4+
5+
class EventBus<T> {
6+
private val subscriptions = mutableMapOf<String, Subscription<T>>()
7+
private val subscriptionLock = Any()
8+
9+
fun publish(topicId: String, value: T) {
10+
val subscription = synchronized(subscriptionLock) {
11+
subscriptions[topicId]
12+
}
13+
subscription?.publish(value)
14+
}
15+
16+
fun subscribe(topicId: String, callback: suspend (T) -> Unit) {
17+
synchronized(subscriptionLock) {
18+
val topic = subscriptions.getOrPut(topicId) {
19+
Subscription()
20+
}
21+
topic.subscribe(callback)
22+
}
23+
}
24+
25+
fun unsubscribe(topicId: String, callback: suspend (T) -> Unit) {
26+
synchronized(subscriptionLock) {
27+
val topic = subscriptions[topicId]
28+
topic?.unsubscribe(callback)
29+
}
30+
}
31+
}

app/src/main/java/com/kylecorry/trail_sense/tools/tools/infrastructure/Tools.kt

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import com.kylecorry.andromeda.core.system.Resources
88
import com.kylecorry.andromeda.core.tryOrDefault
99
import com.kylecorry.andromeda.widgets.Widgets
1010
import com.kylecorry.luna.hooks.Hooks
11-
import com.kylecorry.luna.subscriptions.generic.Subscription
1211
import com.kylecorry.luna.text.capitalizeWords
1312
import com.kylecorry.trail_sense.R
1413
import com.kylecorry.trail_sense.settings.SettingsToolRegistration
14+
import com.kylecorry.trail_sense.shared.andromeda_temp.EventBus
1515
import com.kylecorry.trail_sense.shared.map_layers.preferences.repo.MapLayerDefinition
1616
import com.kylecorry.trail_sense.shared.quickactions.QuickActionOpenTool
1717
import com.kylecorry.trail_sense.shared.views.QuickActionNone
@@ -63,9 +63,6 @@ import com.kylecorry.trail_sense.tools.waterpurification.WaterBoilTimerToolRegis
6363
import com.kylecorry.trail_sense.tools.weather.WeatherToolRegistration
6464
import com.kylecorry.trail_sense.tools.whistle.WhistleToolRegistration
6565
import com.kylecorry.trail_sense.tools.whitenoise.WhiteNoiseToolRegistration
66-
import kotlinx.coroutines.CoroutineScope
67-
import kotlinx.coroutines.Dispatchers
68-
import kotlinx.coroutines.launch
6966

7067
object Tools {
7168

@@ -120,9 +117,7 @@ object Tools {
120117
MapToolRegistration,
121118
MagnifierToolRegistration
122119
)
123-
private val topics = mutableMapOf<String, Subscription<Bundle>>()
124-
private val broadcastScope = CoroutineScope(Dispatchers.Main)
125-
120+
private val bus = EventBus<Bundle>()
126121

127122
fun isToolAvailable(context: Context, toolId: Long): Boolean {
128123
return getTool(context, toolId) != null
@@ -137,7 +132,6 @@ object Tools {
137132
registry.map { it.getTool(context.applicationContext) }
138133
}
139134

140-
141135
return tools.filter { !availableOnly || it.isAvailable(context) }
142136
}
143137

@@ -174,21 +168,15 @@ object Tools {
174168
}
175169

176170
fun broadcast(toolBroadcastId: String, data: Bundle? = null) {
177-
broadcastScope.launch {
178-
topics[toolBroadcastId]?.publish(data ?: Bundle())
179-
}
171+
bus.publish(toolBroadcastId, data ?: Bundle())
180172
}
181173

182174
fun subscribe(toolBroadcastId: String, callback: suspend (Bundle) -> Unit) {
183-
val topic = topics.getOrPut(toolBroadcastId) {
184-
Subscription()
185-
}
186-
topic.subscribe(callback)
175+
bus.subscribe(toolBroadcastId, callback)
187176
}
188177

189178
fun unsubscribe(toolBroadcastId: String, callback: suspend (Bundle) -> Unit) {
190-
val topic = topics[toolBroadcastId]
191-
topic?.unsubscribe(callback)
179+
bus.unsubscribe(toolBroadcastId, callback)
192180
}
193181

194182
fun getService(context: Context, serviceId: String): ToolService? {

0 commit comments

Comments
 (0)