我想在获取数据的同时显示文本到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
中。
问题是您仅在网络调用完成并且缓冲区中建立了完整的结果字符串后才更新 EditText。
要像 ChatGPT 一样增量显示文本,您需要在收到来自 API 响应的每个块时更新 EditText。
这是一种方法:
StringBuilder buffer = new StringBuilder();
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());
});
}
});
});
// After network call
runOnUiThread(() -> {
editText.setText(buffer.toString());
});
这会将响应中的每个块在到达时追加到缓冲区,增量更新 EditText,并在完成后设置最终值。
要点是:
这将提供像ChatGPT一样增量、实时更新的效果。让我知道这是否有帮助!