首页 > 解决方案 > 非活动输入连接

问题描述

在模拟器上运行此应用程序时,它按预期执行,但在实际的 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();

            }
        });
    }
}

标签: javaandroidandroid-studioretrofit2

解决方案


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());
}

推荐阅读