Android InputMethodService.OnUpdate选择是否异步?

Android InputMethodService.OnUpdate选择是否异步?,android,kotlin,ime,android-input-method,Android,Kotlin,Ime,Android Input Method,我正在做一个自定义输入法。我试图跟踪用户何时手动更改文本的选择区域(而不是由于IME本身的操作而更改选择,如) 要做到这一点,我要跟踪IME期望选择位置的位置,并将其与来自的实际选择位置进行比较 例如,要提交文本,我使用: private fun commitTextToInputConnection(text: String) { moveExpectedSelection(text.length) service.currentInputConnection.commitTe

我正在做一个自定义输入法。我试图跟踪用户何时手动更改文本的选择区域(而不是由于IME本身的操作而更改选择,如)

要做到这一点,我要跟踪IME期望选择位置的位置,并将其与来自的实际选择位置进行比较

例如,要提交文本,我使用:

private fun commitTextToInputConnection(text: String)
{
    moveExpectedSelection(text.length)
    service.currentInputConnection.commitText(text, 1)
}
但是,如果我这样做:

commitTextToInputConnection("Test1")
commitTextToInputConnection("Test2")
我发现,顺序如下:

1-预期的“测试1”的SelectionPosition更新

2-预期的“Test2”选择位置更新

3-调用“Test1”的onUpdate选择

4-调用“Test2”的onUpdate选择

显然,此顺序不正确,并导致我的IME的ExpectedSelectionPosition不正确

最奇怪的是,对于某些活动,ExpectedSelectionPosition更新和onUpdateSelection调用的顺序总是正确的。对于其他活动,它们总是以相同(错误)的顺序发生

这是怎么回事?我猜,etc必须是异步的,导致这种竞争条件,但文档中根本没有提到这一点

这个问题有什么解决办法吗?或者,是否有其他方法可以专门监听用户手动触发的文本选择更改,而不是IME?

解决方案是使用和

在“batchEdit”块中对currentInputConnection所做的任何更改最后都会集中到一个ONUpdate选择调用中

例如,当执行以下操作时:

service.currentInputConnection.beginBatchEdit()
commitTextToInputConnection("Test1")
commitTextToInputConnection("Test2")
service.currentInputConnection.endBatchEdit()
在对块进行所有更改后,只调用一次OnUpdate选择