应用程序在日志猫"Timeout waiting for IME to handle input event after 2500 ms"中冻结了此消息



我编辑了值为"11491992"的文本 有时在尝试编辑它时,应用程序被冻结并且 logcat 有这个Timeout waiting for IME to handle input event after 2500 ms: com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME

[更新]

我有一些编辑文本视图,并使用 RxBinding 来控制基于这些编辑文本视图的启用/禁用提交按钮


val bag = CompositeDisposable()
RxTextView.textChanges(edFirstName)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.map { it.toString().trim() }
.subscribe {
btnSubmit.isEnabled = it.isNotBlank()
updateRequest.firstName = it
}.addTo(bag)
RxTextView.textChanges(edLastName)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.map { it.toString().trim() }
.subscribe {
btnSubmit.isEnabled = it.isNotBlank()
updateRequest.lastName = it
}.addTo(bag)

这段代码没问题。

val bag = CompositeDisposable()
RxTextView.textChanges(edFirstName)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.map { it.toString().trim() }
.subscribe {
btnSubmit.isEnabled = it.isNotBlank()
}.apply { bag.add(this) }
RxTextView.textChanges(edLastName)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.map { it.toString().trim() }
.subscribe {
btnSubmit.isEnabled = it.isNotBlank()
}.apply { bag.add(this) }
}

当主线程上发生长时间操作时,就会发生 ANR。如果此线程繁忙,Android 将无法在应用程序中处理任何其他 GUI 事件,从而引发 ANRApplication Not Responding对话框。

android.view.inputmethod.InputMethodManager的源代码中看到这个函数void finishedInputEvent(int seq, boolean handled, boolean timeout) { ... }

if (timeout) {
Log.w(TAG, "Timeout waiting for IME to handle input event after "
+ INPUT_METHOD_NOT_RESPONDING_TIMEOUT + " ms: " + p.mInputMethodId);
} else {
mH.removeMessages(MSG_TIMEOUT_INPUT_EVENT, p);
}

还要始终尝试在主线程以外的任何线程上处理所有耗时的操作。

更新 1:

请参阅应用如何在没有 ANR 的情况下挂起?

  • 您应该使用探查器屏幕。
  • 泄漏金丝雀,如果内存泄漏。

最新更新