应用已冻结,并在 logcat "Timeout waiting for IME to handle input event after 2500 ms" 中显示此消息

App is freezed with this messge in logcat "Timeout waiting for IME to handle input event after 2500 ms"

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

[更新]

我有一些 EditText 视图并使用 RxBinding 来控制 enable/disable 基于这些 EditText 视图的提交按钮



        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 事件,因此抛出一个 ANR Application 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:

  • 你应该使用分析器屏幕。
  • LeakCanary 如果内存泄漏。