Kotlin Academy · पाठ

SharedFlow: Event Buses और One-Shot Events

Event broadcasting के लिए SharedFlow replay और extraBufferCapacity configure करें।

पाठ 2, कुल 4 में से13 चरण

SharedFlow: Event Buses और One-Shot Events, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

SharedFlow क्या है

SharedFlow एक हॉट फ़्लो है, जो सभी सक्रिय कलेक्टर को प्रसारित करता है। StateFlow के विपरीत, इसमें वर्तमान मान की कोई अवधारणा नहीं होती—यह पूरी तरह इवेंट-आधारित है।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val events = MutableSharedFlow<String>()
    launch { events.collect { println("Collector 1: $it") } }
    launch { events.collect { println("Collector 2: $it") } }
    delay(50)
    events.emit("UserLoggedIn")
    events.emit("DataRefreshed")
    delay(50)
    coroutineContext.cancelChildren()
}

रीप्ले पैरामीटर

replay अंतिम N उत्सर्जनों को बफ़र करता है। नए कलेक्टर को तुरंत पिछले अधिकतम N इवेंट मिलते हैं। डिफ़ॉल्ट 0 है, यानी कोई रीप्ले नहीं।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val flow = MutableSharedFlow<Int>(replay = 2)
    flow.emit(1); flow.emit(2); flow.emit(3)
    // Late subscriber gets last 2:
    flow.collect { print("$it ") }  // prints 2 3
}

extraBufferCapacity

extraBufferCapacity रीप्ले के अतिरिक्त बफ़र की जगह जोड़ता है। बफ़र भरने तक भेजने वाले बिना निलंबित हुए उत्सर्जन कर सकते हैं।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val flow = MutableSharedFlow<Int>(
        replay = 0,
        extraBufferCapacity = 10
    )
    // Can emit up to 10 times without a collector ready:
    repeat(10) { flow.tryEmit(it) }
    launch { flow.collect { print("$it ") } }
    delay(50)
    coroutineContext.cancelChildren()
}

निलंबन के बिना उत्सर्जन के लिए tryEmit

tryEmit(value) बिना निलंबित हुए उत्सर्जन करता है और बफ़र पूरा होने पर false लौटाता है। इसका उपयोग नॉन-सस्पेंड कॉन्टेक्स्ट, जैसे कॉलबैक और क्लिक हैंडलर, में करें।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val flow = MutableSharedFlow<String>(extraBufferCapacity = 5)
    val ok = flow.tryEmit("click")  // non-suspending
    println("Emitted: $ok")
    launch { flow.collect { println(it) } }
    delay(50)
    coroutineContext.cancelChildren()
}

एक-बार होने वाले इवेंट (यूआई नेविगेशन)

नेविगेशन या Snackbar दिखाने जैसे एक-बार होने वाले यूआई इवेंट के लिए replay=0 वाला SharedFlow उपयोग करें—कंपोज़िशन दोबारा होने पर इवेंट फिर से नहीं चलाए जाते।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
class NavViewModel {
    private val _events = MutableSharedFlow<String>()
    val events = _events.asSharedFlow()
    fun navigateTo(route: String) {
        // viewModelScope.launch:
        kotlinx.coroutines.GlobalScope.launch { _events.emit(route) }
    }
}
// Collect in UI:
// viewModel.events.collect { route -> navController.navigate(route) }

SharedFlow और StateFlow

StateFlow: वर्तमान मान वाली स्टेट, जैसे यूआई स्टेट। SharedFlow: बिना स्थायित्व वाले इवेंट, जैसे नेविगेशन, Snackbar और एनालिटिक्स। चुनाव इस आधार पर करें कि उपभोक्ताओं को नवीनतम मान की आवश्यकता है या नहीं।

import kotlinx.coroutines.flow.*
// StateFlow: always has a value; new subscribers get current value
val uiState = MutableStateFlow("idle")

// SharedFlow: no stored value; events fire and are gone (unless replay>0)
val singleEvents = MutableSharedFlow<String>(replay = 0)

fun main() { println("State = what it is; Event = what happened") }

SharedFlow के साथ इवेंट बस

singleton SharedFlow का उपयोग करके पूरे ऐप के लिए एक सरल इवेंट बस लागू करें और RxJava PublishSubject पैटर्न का स्थान लें।

import kotlinx.coroutines.flow.*
object EventBus {
    private val _events = MutableSharedFlow<Any>(extraBufferCapacity = 100)
    val events = _events.asSharedFlow()
    fun post(event: Any) { _events.tryEmit(event) }
}
sealed class AppEvent {
    object UserLoggedOut : AppEvent()
    data class ShowError(val msg: String) : AppEvent()
}
// Usage: EventBus.post(AppEvent.UserLoggedOut)

subscriptionCount

sharedFlow.subscriptionCount एक StateFlow है, जो सक्रिय कलेक्टर की संख्या को ट्रैक करता है—यह अपस्ट्रीम उत्पादकों को शुरू या बंद करने के लिए उपयोगी है।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val flow = MutableSharedFlow<Int>()
    println("Subscribers: ${flow.subscriptionCount.value}")  // 0
    val job = launch { flow.collect { } }
    delay(50)
    println("Subscribers: ${flow.subscriptionCount.value}")  // 1
    job.cancel()
    delay(50)
    println("Subscribers: ${flow.subscriptionCount.value}")  // 0
}

resetReplayCache

resetReplayCache() बफ़र किए गए रीप्ले कैश को साफ़ करता है। यह तब उपयोगी है, जब रीप्ले किए जाने वाले इवेंट पुराने हो चुके हों और नए सब्सक्राइबर को उन्हें नहीं देखना चाहिए।

import kotlinx.coroutines.flow.*
fun main() {
    val flow = MutableSharedFlow<Int>(replay = 3)
    flow.tryEmit(1); flow.tryEmit(2); flow.tryEmit(3)
    println("Replay cache: ${flow.replayCache}")  // [1, 2, 3]
    flow.resetReplayCache()
    println("Replay cache: ${flow.replayCache}")  // []
}

SharedFlow में बैक-प्रेशर संभालना

जब संग्रहकर्ता धीमे हों, तो विकल्प चुनने के लिए onBufferOverflow का उपयोग करें: SUSPEND (डिफ़ॉल्ट), DROP_OLDEST या DROP_LATEST।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.channels.BufferOverflow
fun main() = runBlocking {
    val flow = MutableSharedFlow<Int>(
        replay = 0,
        extraBufferCapacity = 3,
        onBufferOverflow = BufferOverflow.DROP_OLDEST
    )
    repeat(10) { flow.tryEmit(it) }
    launch {
        flow.collect { println(it) }  // only sees most recent 3
    }
    delay(50)
    coroutineContext.cancelChildren()
}

टाइमआउट के साथ संग्रहण

सीमित संख्या में इवेंट संसाधित करने और फिर रुकने के लिए SharedFlow को टाइमआउट के साथ संग्रहित करें। यह परीक्षण या सीमित प्रसंस्करण के लिए उपयोगी है।

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val events = MutableSharedFlow<String>()
    launch { repeat(5) { delay(50); events.emit("Event $it") } }
    withTimeoutOrNull(200) {
        events.collect { println(it) }
    }
    println("Done collecting")
}

त्वरित जाँच

नेविगेशन जैसे एक-बार होने वाले UI इवेंट के लिए आपको किस replay मान का उपयोग करना चाहिए?

पुनरावृत्ति

SharedFlow एक हॉट इवेंट प्रसारक है। एक-बार होने वाले इवेंट के लिए replay=0 और देर से जुड़ने वाले सब्सक्राइबर के लिए replay>0 का उपयोग करें। सस्पेंड-संदर्भ के बाहर tryEmit का उपयोग करें। इवेंट के लिए SharedFlow और स्थिति के लिए StateFlow चुनें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “SharedFlow: Event Buses और One-Shot Events” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “SharedFlow: Event Buses और One-Shot Events” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“SharedFlow: Event Buses और One-Shot Events” में मैं क्या सीखूँगा?

Event broadcasting के लिए SharedFlow replay और extraBufferCapacity configure करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“SharedFlow: Event Buses और One-Shot Events” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. StateFlow: UI के लिए Hot State Holder
  2. SharedFlow: Event Buses और One-Shot Events
  3. shareIn और stateIn से Cold Flow को Hot में बदलना
  4. Turbine से StateFlow और SharedFlow का Testing
← Kotlin Academy पर वापस जाएँ