启动多个暂停乐趣

时间:2019-12-24 10:52:23

标签: coroutine kotlin-coroutines

我创建了一个TextWatcher扩展名以侦听带有反跳的文本更新。我将TextWatcher包裹到callbackFlow中,该文本提供了通过Flow输入的文本。

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

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)
}

1 个答案:

答案 0 :(得分: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)
}

我几乎做同样的事情,除了如果其中一个由于某种原因失败,另一个将不会立即被取消。