1

在我的活动中,我需要在回调中发出不同的流值,例如:

  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    emit(1)
  }


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    emit(1)
}

并在另一个类中收集,例如:

collect{value->
  when(value){
    1->..
    2->..
  }
}

可能吗?

4

1 回答 1

1

这个怎么样?:

制作一个接口来通知您需要的每个回调、覆盖的方法等:

interface Notifier<T> {
    fun notify(t: T)
}

在您的类中声明一个对象来实现该接口:

private var notifier: Notifier<Int>? = null

还要使用构建器声明一个 Flow callbackFlow,您将在其中初始化通知器对象:

val myFlow = callbackFlow<Int> {
    notifier = object: Notifier<Int> {
        override fun notify(t: Int) {
            launch {
                channel.send(t)
            }
        }
    }
    awaitClose()
}

在您的方法中通知您的数据:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    notifier?.notify(1)
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    notifier?.notify(2)
}

最后像这样使用 Flow:

val job = launch(Dispatchers.Default) {
    myClassReference.myFlow
        .collect {
            when(it) {
                1 -> { println("It's one") }
                2 -> { println("It's two") }
            }
        }
}

并确保job正确取消。

于 2020-05-03T11:40:14.703 回答