【问题标题】:Inactive input connection非活动输入连接
【发布时间】:2021-08-24 19:01:16
【问题描述】:

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

            }
        });
    }
}

【问题讨论】:

    标签: java android android-studio retrofit2


    【解决方案1】:

    InputConnection 被清除文本的请求所淹没。在尝试清除之前,我尝试修改代码以检查文本长度:

    if (editText.length() > 0) {
      editText.setText(null);
    }
    

    这有助于缓解快速按下发送按钮不再导致 InputConnectionWrapper 警告流的问题。但是,当用户在应用负载充足等情况下快速按下发送按钮时,这仍然容易出现问题。

    还有另一种清除文本的方法:Editable.clear()。有了这个,我根本没有收到警告:

    (like getExtractedText on inactive InputConnection)
    

    试试这个:

    if (editText.length() > 0) {
      editText.getText().clear();
    }
    

    请注意,如果您希望清除所有输入状态而不仅仅是文本(自动文本、自动大写、多次点击、撤消),您可以使用 TextKeyListener.clear(Editable e)。

    if (editText.length() > 0) {
     TextKeyListener.clear(editText.getText());
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2015-06-06
      • 2013-12-12
      • 2012-08-08
      • 1970-01-01
      • 2021-09-10
      • 2012-07-29
      • 2017-02-27
      相关资源
      最近更新 更多