EditText 在循环中不会像 chatGPT 那样显示文本

问题描述 投票:0回答:1

我想在获取数据的同时显示文本到edittext,但这只是最终显示数据。

这是代码

    void networkcall(String query) {
    messageList.add(new MessageModel(query, 1));
    messageList.add(new MessageModel("Typing...", 3));
    adapter.notifyItemInserted(messageList.size() - 1);
    OpenAiService service = new OpenAiService(API_KEY);

    List<ChatMessage> message = new ArrayList<ChatMessage>();
    message.add(new ChatMessage(ChatMessageRole.USER.value(), query));

    ChatCompletionRequest chatCompletionRequest;

    chatCompletionRequest = ChatCompletionRequest
            .builder()
            .model("gpt-3.5-turbo")
            .messages(message)
            .n(1)
            .maxTokens(500)
            .logitBias(Collections.emptyMap())
            .build();

    Flowable<ChatCompletionChunk> flowableResult = service.streamChatCompletion(chatCompletionRequest);
    StringBuilder buffer = new StringBuilder();
    flowableResult.subscribe(chunk -> {
        chunk.getChoices().forEach(choice -> {
            String result = choice.getMessage().getContent();
            if (result != null) {
                buffer.append(result);
                Log.d("Gdfgrd", result);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        editQuery.setText(buffer);

                    }
                });

                Log.d("Gdfgrd", result);


            }

        });
    });

    message.add(new ChatMessage(ChatMessageRole.SYSTEM.value(), buffer.toString()));

}

我期待缓冲区像 ChatGPT 一样显示在

EditText
中。

android networking android-edittext openai-api chatgpt-api
1个回答
0
投票

问题是您仅在网络调用完成并且缓冲区中建立了完整的结果字符串后才更新 EditText。

要像 ChatGPT 一样增量显示文本,您需要在收到来自 API 响应的每个块时更新 EditText。

这是一种方法:

  1. 将缓冲区声明为类变量,以便可以跨方法访问:
StringBuilder buffer = new StringBuilder(); 
  1. 在订阅方法中,将每个块附加到缓冲区并更新 EditText:
flowableResult.subscribe(chunk -> {

  chunk.getChoices().forEach(choice -> {
    
    String result = choice.getMessage().getContent();
    
    if (result != null) {
    
      buffer.append(result);
      
      // Update EditText on UI thread
      runOnUiThread(() -> {
        editText.setText(buffer.toString());
      });
      
    }

  });
  
});
  1. 网络调用结束后,将最终的缓冲区值设置为EditText:
// After network call
runOnUiThread(() -> {
  editText.setText(buffer.toString()); 
});

这会将响应中的每个块在到达时追加到缓冲区,增量更新 EditText,并在完成后设置最终值。

要点是:

  • 跨调用维护缓冲区状态
  • 更新收到的每个块的 UI
  • 完成后设置最终值

这将提供像ChatGPT一样增量、实时更新的效果。让我知道这是否有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.