我编辑了值为"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 的情况下挂起?
- 您应该使用探查器屏幕。
- 泄漏金丝雀,如果内存泄漏。