问题
我在logcat中收到以下警告。
getExtractedText on inactive InputConnection
我无法找到背后的原因。请帮忙
#1 热门回答(41 赞)
我遇到了类似的问题。我的logcat:
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection
...
I/Choreographer(20010): Skipped 30 frames! The application may be doing too much work on its main thread.
我的情况:我有一个用户输入的EditText视图。当用户按下按钮时,EditText将被清除。当我快速按下按钮时,大量不活动的InputConnection条目流出。
例如:
editText.setText(null);
我上面的logcat中的最后一行提供了一个很好的指示。果然,InputConnection被清除文本的请求所淹没。我尝试修改代码以检查文本长度,然后再尝试清除它:
if (editText.length() > 0) {
editText.setText(null);
}
这有助于缓解快速按下按钮不再导致IInputConnectionWrapper警告流的问题。然而,当用户在应用程序处于足够负载之下时,在键入内容并按下按钮或按下按钮之间快速交替时,这仍然存在问题。
幸运的是,我找到了另一种清除文本的方法:Editable.clear()。有了这个,我根本没有得到警告:
if (editText.length() > 0) {
editText.getText().clear();
}
请注意,如果你希望清除所有输入状态而不仅仅是文本(autotext,autocap,multitap,undo),则可以使用TextKeyListener.clear(Editable e)。
if (editText.length() > 0) {
TextKeyListener.clear(editText.getText());
}
#2 热门回答(13 赞)
更新:
我收到InputConnection警告的原因不是因为我在哪里设置文本(即在onTextChanged
callback或afterTextChanged
) - 这是因为我使用的是setText
。
我通过致电解决了这个问题:
hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");
注意:我仍然在afterTextChanged
callback中进行调用,尽管它在没有来自ontextChanged
的警告的情况下也能正常工作。
上一个答案:
我在logcat中也得到了相同的消息,尽管我的情况略有不同。我想读取每个进入EditText的字符(或组成字符/粘贴文本),然后将有问题的EditText重置为默认的初始化字符串。
明文部分按照Johnson的解决方案工作。但是,重置文本是有问题的,我会收到输入连接警告。
最初,myonTextChanged(CharSequence s, ...)
的定义如下:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (isResettingKeyboard)
return;
// ... do what needs to be done
resetKeyboardString();
}
public void resetKeyboardString()
{
isResettingKeyboard = true;
hiddenKeyboardText.getText().clear();
hiddenKeyboardText.setText(keyboardInitString);
hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);
isResettingKeyboard = false;
}
当调用onTextChanged(...)
时,EditText处于只读模式。我不确定这是否意味着我们不能做多于callgetText.clear()
(setText(...)
calls也会产生inputConnection警告)。
但是,callbackafterTextChanged(Editable s)
是设置文本的正确位置。
@Override
public void afterTextChanged(Editable s) {
if (isResettingKeyboard)
return;
resetKeyboardString();
// ...
}
到目前为止,这是在没有任何警告的情况下工作的。
#3 热门回答(7 赞)
来自帮助文档
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html> InputConnection接口是从InputMethod返回到接收其输入的应用程序的通信通道。它用于执行诸如读取光标周围的文本,将文本提交到文本框以及将原始键事件发送到应用程序之类的操作。
此外,进一步阅读显示
getExtractedText():如果输入连接无效(例如进程崩溃)或客户端花费太长时间来响应文本(返回时间为几秒钟),则此方法可能会失败。在任何一种情况下,都返回null。
它似乎还监视此类文本的更改,并警告更改。
要解决问题,你必须探索正在进行的任何数据库查询,可能是在布局中的listViews或列表周围。
如果你没有任何视图,例如它在后台随机发生,那么我会建议它不是UI元素问题,所以忽略文本字段等。它可以是将信息存储在游标中或请求游标的后台服务。
此外,你的应用程序是否会出现此问题?或者你最近安装过的其他人。列出完整的logCat跟踪。有人可能会认识到这个问题。
我猜想如果你没有写一些具体的东西,那么它的某些人会记录消息,或者你使用的是某个库的消息?