【Kotlin】使用 Channel 实现发布/订阅模式

本文介绍了如何在Android应用中,通过定义全局MessageChannel实现页面间的整数计数值发布与订阅。MainActivity作为发布者,定时发送计数值,FirstActivity、SecondActivity、ThirdActivity作为订阅者接收并实时更新。
摘要由CSDN通过智能技术生成

一、角色设定

  1. 发布者:MainActivity
  2. 订阅者:FirstActivity、SecondActivity、ThirdActivity

二、代码实现

  1. 定义全局 Channel

     object MessageChannel {
         val channel = Channel<Int>()
     }
    

    注:MessageChannel.channel 是一个 Channel 对象,用于在不同页面之间传递整数类型的计数值。它充当了一个中介,允许一个页面发送计数值,而其他页面则可以接收这些计数值。

  2. 发布者 MainActivity

     class MainActivity : AppCompatActivity() {
    
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             setContentView(R.layout.activity_main)
    
             startTimer()
             startReceiver()
    
             // 点击跳转到 FirstActivity
             findViewById<Button>(R.id.btn_first).setOnClickListener {
                 val intent = Intent(this, FirstActivity::class.java)
                 startActivity(intent)
             }
    
             // 点击跳转到 SecondActivity
             findViewById<Button>(R.id.btn_second).setOnClickListener {
                 val intent = Intent(this, SecondActivity::class.java)
                 startActivity(intent)
             }
    
             // 点击跳转到 ThirdActivity
             findViewById<Button>(R.id.btn_third).setOnClickListener {
                 val intent = Intent(this, ThirdActivity::class.java)
                 startActivity(intent)
             }
         }
    
         private fun startTimer() {
             lifecycleScope.launch {
                 var count = 0
                 while (true) {
                     MessageChannel.channel.send(count)
                     Log.d("Tyhoo", "主页面 send: $count")
                     count++
                     delay(1000)
                 }
             }
         }
    
         private fun startReceiver() {
             lifecycleScope.launch {
                 while (true) {
                     val count = MessageChannel.channel.receive()
                     Log.d("Tyhoo", "主页面 received: $count")
                 }
             }
         }
    
         override fun onDestroy() {
             super.onDestroy()
             MessageChannel.channel.cancel()
         }
     }
    

    注:在 MainActivity 的 startTimer 函数中,使用协程和循环不断地发送计数值到 MessageChannel.channel。这样做的效果是,每隔一秒钟,会将一个递增的计数值发送到通道中。

    在 MainActivity 的 startReceiver 函数中,使用协程和循环不断地接收 MessageChannel.channel 中的计数值。这样做的效果是,一旦有计数值被发送到通道中,该函数就会立即接收并打印该计数值。

  3. 订阅者 FirstActivity(SecondActivity、ThirdActivity 同理)

     class FirstActivity : AppCompatActivity() {
    
         private var job: Job? = null
    
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             job = startReceivingCount()
         }
    
         private fun startReceivingCount(): Job {
             return lifecycleScope.launch {
                 for (count in MessageChannel.channel) {
                     Log.d("Tyhoo", "First 页面 received: $count")
                 }
             }
         }
    
         override fun onDestroy() {
             super.onDestroy()
             job?.cancel()
         }
     }
    

    注:在 FirstActivity 的 startReceivingCount 函数中,使用协程和循环不断地接收 MessageChannel.channel 中的计数值。这样做的效果是,在该页面中可以实时接收来自 MainActivity 发送的计数值,并打印在日志中。

三、总结

通过使用 Channel,实现了一种简单的发布/订阅模式,其中 MainActivity 充当了发布者,而 FirstActivity(SecondActivity、ThirdActivity ) 充当了订阅者。计数值通过 Channel 在两个页面之间进行传递,并且能够实时更新响应。这种方式提供了一种灵活的通信机制,可以在不同的组件或模块之间进行数据传递事件通知

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴同学是个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值