【问题标题】:Launch multiple suspend fun启动多个暂停乐趣
【发布时间】:2019-12-24 10:52:23
【问题描述】:

我创建了一个TextWatcher 扩展来收听带有去抖动的文本更新。我将TextWatcher 包装成callbackFlow,它通过Flow 提供文本输入。

问题是调用collect() 会暂停处理,我需要为多个EditText 注册它。在scope 中调用多个launch 是否正确?

private fun initListeners() = lifecycleScope.launch {
        launch {
            edittext_taskdetail_title.textChangedFlow()
                .collect { text -> viewModel.updateTitle(text) }
        }

        launch {
            edittext_taskdetail_description.textChangedFlow()
                .collect { text -> viewModel.updateDescription(text) }
        }
    }

这是扩展名:

fun TextView.textChangedFlow(): Flow<String> {
    val flow: Flow<String> = callbackFlow {
        val listener = object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {}

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                offer(s.toString())
            }
        }
        addTextChangedListener(listener)
        awaitClose { removeTextChangedListener(listener) }
    }

    return flow.debounce(TEXT_UPDATE_DEBOUNCE)
}

【问题讨论】:

    标签: coroutine kotlin-coroutines


    【解决方案1】:

    我认为你所拥有的是可以接受的,但这里有一个替代方案。

    private fun initListeners() {
        edittext_taskdetail_title.textChangedFlow()
            .onEach { text -> viewModel.updateTitle(text) }
            .launchIn(lifecycleScope)
    
        edittext_taskdetail_description.textChangedFlow()
            .onEach { text -> viewModel.updateDescription(text) }
            .launchIn(lifecycleScope)
    }
    

    我做的事情几乎相同,只是如果其中一个因某种原因失败,另一个不会立即取消。

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 2020-06-24
      • 2020-04-05
      • 2019-05-20
      • 2022-07-25
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多