java - 非活动输入连接
问题描述
在模拟器上运行此应用程序时,它按预期执行,但在实际的 android 设备上运行时,它不会产生所需的结果,并且在日志中显示警告“getExtractedText on inactive InputConnection”。这是一个聊天机器人应用程序,我在其中使用 retrofit2 库对 api 执行获取请求。
package com.example.chatbot;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context;
import android.inputmethodservice.Keyboard;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private RecyclerView chatBotRV;
private MessageAdapter messageAdapter;
private FloatingActionButton sendButton;
private EditText queryText;
private String USER_KEY = "USER";
private String BOT_KEY = "CHAT_BOT";
private Retrofit retrofit;
private APIservice apIservice;
private ArrayList<ChatModel> chatModelArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chatBotRV = findViewById(R.id.chat_bot_rv);
sendButton = findViewById(R.id.send_button);
queryText = findViewById(R.id.chat_ev);
chatModelArrayList = new ArrayList<>();
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!queryText.getText().toString().isEmpty()){
String message = queryText.getText().toString();
queryText.setText(null);
getMessage(message);
}else{
Toast.makeText(MainActivity.this, "Please enter your message :)", Toast.LENGTH_SHORT).show();
return;
}
}
});
messageAdapter = new MessageAdapter(chatModelArrayList, MainActivity.this);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
chatBotRV.setLayoutManager(layoutManager);
chatBotRV.setAdapter(messageAdapter);
}
private void getMessage(String msg){
ChatModel chatModel_user = new ChatModel(msg, USER_KEY);
chatModelArrayList.add(chatModel_user);
messageAdapter.notifyDataSetChanged();
String url = "MY_API_URL"+msg;
String BASE_URL = "http://api.brainshop.ai/";
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
apIservice = retrofit.create(APIservice.class);
Call<MessageModel> call = apIservice.getMessage(url);
call.enqueue(new Callback<MessageModel>() {
@Override
public void onResponse(Call<MessageModel> call, Response<MessageModel> response) {
if(response.isSuccessful()){
MessageModel model = response.body();
chatModelArrayList.add(new ChatModel(model.getCnt(), BOT_KEY));
messageAdapter.notifyDataSetChanged();
}else{
Toast.makeText(MainActivity.this, "Some error on our side", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<MessageModel> call, Throwable t) {
chatModelArrayList.add(new ChatModel("Please revert your query", BOT_KEY));
messageAdapter.notifyDataSetChanged();
}
});
}
}
解决方案
InputConnection 被清除文本的请求所淹没。在尝试清除之前,我尝试修改代码以检查文本长度:
if (editText.length() > 0) {
editText.setText(null);
}
这有助于缓解快速按下发送按钮不再导致 InputConnectionWrapper 警告流的问题。但是,当用户在应用程序处于足够负载时快速按下发送按钮时,这仍然容易出现问题等。
还有另一种清除文本的方法:Editable.clear()。有了这个,我根本没有收到警告:
(like getExtractedText on inactive InputConnection)
尝试这个:
if (editText.length() > 0) {
editText.getText().clear();
}
请注意,如果您希望清除所有输入状态而不仅仅是文本(autotext、autocap、multitap、undo),您可以使用 TextKeyListener.clear(Editable e)。
if (editText.length() > 0) {
TextKeyListener.clear(editText.getText());
}
推荐阅读
- .net - 为什么 1m.ToString() 返回的结果与 1.0m.ToString() 不同?
- asp.net - 直接从 Visual Studio 运行 ASP.NET 时不显示图像
- delphi - 客户端/服务器应用程序
- docker - 我使用 Docker 代理的 jenkinsfile 在 Jenkins 中执行时挂起
- java - 关于activity和fragment之间通信的问题
- c++ - Raku 中 C++ 和 NativeCall 之间的不同输出
- c++ - C++ / CMake:为许多“源插件”制作插件系统
- r - 检测 R 中字符串的一部分(不完全匹配)
- python - time.sleep 对我不起作用,因为滚动命令不断发生
- azure - 如何将文件夹从 TEST 应用服务复制到 Azure 上的 LIVE 应用服务