目录

Android-仿-DeepSeek-思考效果逐字显示-AI-生成内容,支持加粗颜色,复制内容

Android 仿 DeepSeek 思考效果:逐字显示 AI 生成内容,支持加粗、颜色,复制内容

最近特别火的非AI莫属了,对我们高级搬运工太友好了,不管是网页端还是APP端,输入你要问的问题,都会逐字给你显示出来,有的还会加粗,这种效果看着不错,今天就带大家一起来实现。有啥更好的建议请在评论区留言。

首先我们要了解,这种数据不像平常调用接口返的,一下子都给你返了,这里会用到接口返回 EventStream 结构的数据(即接收读取 stream 流)
HTTP 的 EventStream 格式(也称为 Server-Sent Events,SSE)

是一种服务器向客户端推送实时数据的轻量级协议,基于 HTTP 长连接实现。以下是其核心特点和格式解析:

基本原理

使用 HTTP/1.1 长连接,默认保持连接状态

服务器主动向客户端发送数据,客户端 单向接收

基于文本流传输,内容类型为text/event-stream

数据格式

每条消息由多个字段组成,字段间用空行分隔,示例:

id: 123          // 事件ID
event: message   // 事件类型(可选)
data: Hello World// 数据内容
retry: 10000     // 重连时间(毫秒)

核心优势

简单易用:基于标准 HTTP 协议,无需复杂握手

自动重连:客户端支持自动恢复连接

低开销:文本格式传输,比 WebSocket 更轻量

支持持久连接:默认保持连接状态

与 WebSocket 对比

特性EventStream (SSE)WebSocket
方向单向(服务器→客户端)全双工
协议HTTPws/wss
数据格式文本流二进制 / 文本
浏览器支持原生支持需 JS 实现

典型应用场景

实时通知(新闻推送、消息提醒)

股票行情更新

日志监控系统

在线协作编辑

注意事项

处理连接中断:需实现重连机制

内存管理:避免长时间占用资源

数据解析:注意处理分块传输编码

线程安全:确保 UI 更新在主线程

在 Android 开发中,建议使用okhttp或Retrofit库处理 EventStream,配合协程或 RxJava 进行异步处理,保证主线程不阻塞。对于复杂场景,可封装 SSE 客户端类,实现自动重连、事件分发等功能。

EventStream 的关键点

基于 HTTP,使用 text/event-stream 媒体类型,每个事件由多个字段组成,如 id、event、data 等,支持分块传输,适合实时更新。同时,要提到与 WebSocket 的区别,比如 SSE 是单向的,而 WebSocket 是全双工的,这样用户能更好地理解适用场景。

效果图

网页版

https://i-blog.csdnimg.cn/direct/b9dd79f959694735a778e3262d7e541b.png

APP端

https://i-blog.csdnimg.cn/direct/db349bc68add412ba5c77a9a178f8d74.gif

开始实现

一、自定义TextView

package com.example.testdemo

import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.Typeface
import android.net.Uri
import android.text.*
import android.text.style.AlignmentSpan
import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.text.style.StyleSpan
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.widget.ScrollView
import android.os.Handler
import android.os.Looper
import android.text.method.ScrollingMovementMethod
import androidx.appcompat.widget.AppCompatTextView

class DeepSeekTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {

    private val mainHandler = Handler(Looper.getMainLooper())
    private val contentBuilder = SpannableStringBuilder()
    private val tempContentList = mutableListOf<String>()
    private var currentLineStart = 0
    private val normalTextColor = Color.parseColor("#8A9098") // 非加粗文本颜色

    init {
        movementMethod = ScrollingMovementMethod()
        highlightColor = resources.getColor(android.R.color.transparent, null)
        isClickable = true
        isFocusable = true
        isLongClickable = false
    }

    fun appendContent(content: String) {
        mainHandler.post {
            tempContentList.add(content)
            val combinedContent = tempContentList.joinToString("")
            processContent(combinedContent)
        }
    }

    private fun processContent(content: String) {
        contentBuilder.clear()
        var isBold = false
        var startIndex = 0
        for (i in content.indices) {
            if (i <= content.length - 2 && content[i] == '*' && content[i + 1] == '*') {
                if (isBold) {
                    // 结束加粗
                    val boldText = content.substring(startIndex, i)
                    addTextWithStyle(boldText, true)
                    isBold = false
                    startIndex = i + 2
                } else {
                    // 开始加粗
                    val normalText = content.substring(startIndex, i)
                    addTextWithStyle(normalText, false)
                    isBold = true
                    startIndex = i + 2
                }
            }
        }
        // 处理最后一段文本
        val lastText = content.substring(startIndex)
        addTextWithStyle(lastText, isBold)

        // 处理 Markdown 链接
        handleMarkdownLinks()

        // 处理换行
        if (content.contains("\n")) {
            handleNewLine()
        }

        text = contentBuilder
        (parent as? ScrollView)?.let { scrollView ->
            scrollView.post {
                scrollView.fullScroll(ScrollView.FOCUS_DOWN)
            }
        }
    }

    private fun addTextWithStyle(text: String, isBold: Boolean) {
        if (text.isNotEmpty()) {
            val start = contentBuilder.length
            contentBuilder.append(text)
            if (isBold) {
                contentBuilder.setSpan(
                    BoldAndBlackSpan(),
                    start,
                    contentBuilder.length,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                )
            } else {
                contentBuilder.setSpan(
                    ForegroundColorSpan(normalTextColor),
                    start,
                    contentBuilder.length,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                )
            }
        }
    }

    private fun handleMarkdownLinks() {
        val text = contentBuilder.toString()
        val linkPattern = "\\[(.*?)\\]\\((.*?)\\)".toRegex()
        val matches = linkPattern.findAll(text)
        for (match in matches) {
            val linkText = match.groupValues[1]
            val linkUrl = match.groupValues[2]
            val start = match.range.first
            val end = match.range.last + 1

            // 删除原 Markdown 格式
            contentBuilder.delete(start, end)

            // 插入链接文本
            contentBuilder.insert(start, linkText)

            // 设置点击事件
            contentBuilder.setSpan(
                object : ClickableSpan() {
                    override fun onClick(widget: View) {
                        val intent = Intent(Intent.ACTION_VIEW)
                        intent.data = Uri.parse(linkUrl)
                        context.startActivity(intent)
                    }

                    override fun updateDrawState(ds: android.text.TextPaint) {
                        super.updateDrawState(ds)
                        ds.color = Color.BLUE
                        ds.isUnderlineText = true
                    }
                },
                start,
                start + linkText.length,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
    }

    private fun handleNewLine() {
        val lineBreaks = contentBuilder.toString().split("\n").size - 1
        if (lineBreaks > 0) {
            currentLineStart = contentBuilder.length - lineBreaks
            contentBuilder.setSpan(
                AlignmentSpan.Standard(android.text.Layout.Alignment.ALIGN_NORMAL),
                currentLineStart,
                contentBuilder.length,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
    }

    fun clear() {
        mainHandler.post {
            contentBuilder.clear()
            tempContentList.clear()
            text = ""
        }
    }

    private class BoldAndBlackSpan : StyleSpan(Typeface.BOLD) {
        override fun updateDrawState(ds: TextPaint) {
            super.updateDrawState(ds)
            ds.color = Color.BLACK
            ds.typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD)
        }
    }

    // 重写 onTouchEvent 方法,确保点击事件传递到 ClickableSpan
    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                // 处理点击按下事件
                val x = event.x.toInt()
                val y = event.y.toInt()
                val layout = layout
                val line = layout.getLineForVertical(y)
                val offset = layout.getOffsetForHorizontal(line, x.toFloat())
                val spans = contentBuilder.getSpans(offset, offset, ClickableSpan::class.java)
                if (spans.isNotEmpty()) {
                    spans[0].onClick(this)
                    return true
                }
            }
            else -> {
                // 其他事件由父类处理
            }
        }
        return super.onTouchEvent(event)
    }

    // 重写 performLongClick 方法,禁止长按
    override fun performLongClick(): Boolean {
        return false
    }
}

二、事件流的处理(写死的数据)

package com.example.testdemo

import android.os.Handler
import android.os.Looper
import org.json.JSONObject
 /**
  * @author: Created by J
  * @desc: 事件流的处理
  */
class MockEventStreamProcessor(private val textView: DeepSeekTextView) {

    private val handler = Handler(Looper.getMainLooper())
    private val mockData = MockData.data

    private var typingSpeed = 100L // 默认打字速度,单位为毫秒

    fun startProcessing() {
        var index = 0

        val runnable = object : Runnable {
            override fun run() {
                if (index < mockData.size) {
                    val dataLine = mockData[index]
                    handleData(dataLine)
                    index++
                    handler.postDelayed(this, typingSpeed)
                } else {
                    // 处理完成事件
                    textView.appendContent("")
                }
            }
        }

        handler.post(runnable)
    }

    private fun handleData(data: String) {
        try {
            val lines = data.split("\n")
            if (lines.size == 2 && lines[0].startsWith("event:") && lines[1].startsWith("data:")) {
                val eventType = lines[0].substring(6)
                val dataJson = JSONObject(lines[1].substring(5))
                val content = dataJson.getString("content")

                when (eventType) {
                    "thinkingProcess" -> textView.appendContent(content)
                    "finalResult" -> textView.appendContent(content)
                    "done" -> handler.removeCallbacksAndMessages(null)
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    // 设置打字速度的方法
    fun setTypingSpeed(speed: Long) {
        this.typingSpeed = speed
    }
}

三、布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".MainActivity">

    <androidx.core.widget.NestedScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:descendantFocusability="beforeDescendants"
        android:fillViewport="true">

        <com.example.testdemo.DeepSeekTextView
            android:id="@+id/deepSeekTv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:lineSpacingExtra="4sp"
            android:paddingBottom="32dp"
            android:scrollbars="vertical"
            android:textSize="13sp" />

    </androidx.core.widget.NestedScrollView>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/black" />

    <Button
        android:id="@+id/startButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击开始思考"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/clearButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="清空内容"
            android:textSize="16sp" />

        <Button
            android:id="@+id/copyButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:layout_weight="1"
            android:text="复制内容"
            android:textSize="16sp" />

    </LinearLayout>

</LinearLayout>

四、调用,包括 开始思考,清空内容插入新内容,复制内容

package com.example.testdemo

import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.widget.Button
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val deepSeekTv = findViewById<DeepSeekTextView>(R.id.deepSeekTv)

        val startButton = findViewById<Button>(R.id.startButton)
        val copyButton = findViewById<Button>(R.id.copyButton)
        val clearButton = findViewById<Button>(R.id.clearButton)
        val mockProcessor = MockEventStreamProcessor(deepSeekTv)

        startButton.setOnClickListener {

            // 设置打字速度(可选)
//         mockProcessor.setTypingSpeed(150)

            mockProcessor.startProcessing()
            // 开启点击监听
            deepSeekTv.movementMethod = LinkMovementMethod.getInstance()
        }
        clearButton.setOnClickListener {
            deepSeekTv.clear()
            val newContent = "这是新的文本内容..."
            deepSeekTv.appendContent(newContent)
        }


        copyButton.setOnClickListener {

            val textToCopy = deepSeekTv.text.toString()
            if (textToCopy.isEmpty()) {
                Toast.makeText(this, "没有可复制的内容", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
            val clip = ClipData.newPlainText("Copied Text", textToCopy)
            clipboard.setPrimaryClip(clip)
            Toast.makeText(this, "已复制到剪贴板", Toast.LENGTH_SHORT).show()

        }


    }

}

五、模拟数据

package com.example.testdemo

/** 模拟数据 */
object MockData {
    val data = listOf(
        "event:thinkingProcess\ndata:{\"content\":\"好的\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"之前\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"今天\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"天气\"}",
        "event:thinkingProcess\ndata:{\"content\":\"怎么样\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"回答\"}",
        "event:thinkingProcess\ndata:{\"content\":\"不会\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"现在\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"输入\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"al\"}",
        "event:thinkingProcess\ndata:{\"content\":\"”,\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可能是\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"详细\"}",
        "event:thinkingProcess\ndata:{\"content\":\"说明\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"或者\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"错误\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"首先\"}",
        "event:thinkingProcess\ndata:{\"content\":\"需要\"}",
        "event:thinkingProcess\ndata:{\"content\":\"判断\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"意图\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可能\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"让我\"}",
        "event:thinkingProcess\ndata:{\"content\":\"进一步\"}",
        "event:thinkingProcess\ndata:{\"content\":\"解释\"}",
        "event:thinkingProcess\ndata:{\"content\":\"为什么\"}",
        "event:thinkingProcess\ndata:{\"content\":\"无法\"}",
        "event:thinkingProcess\ndata:{\"content\":\"回答\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"天气\"}",
        "event:thinkingProcess\ndata:{\"content\":\"的问题\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\\n\\n\"}",
        "event:thinkingProcess\ndata:{\"content\":\"然后\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"我应该\"}",
        "event:thinkingProcess\ndata:{\"content\":\"考虑\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可能的\"}",
        "event:thinkingProcess\ndata:{\"content\":\"真实\"}",
        "event:thinkingProcess\ndata:{\"content\":\"需求\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"他们\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可能\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"感兴趣\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"或者\"}",
        "event:thinkingProcess\ndata:{\"content\":\"需要\"}",
        "event:thinkingProcess\ndata:{\"content\":\"了解\"}",
        "event:thinkingProcess\ndata:{\"content\":\"如何\"}",
        "event:thinkingProcess\ndata:{\"content\":\"获取\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"天气\"}",
        "event:thinkingProcess\ndata:{\"content\":\"数据\"}",
        "event:thinkingProcess\ndata:{\"content\":\"的方法\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"因此\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"我需要\"}",
        "event:thinkingProcess\ndata:{\"content\":\"解释\"}",
        "event:thinkingProcess\ndata:{\"content\":\"当前\"}",
        "event:thinkingProcess\ndata:{\"content\":\"的技术\"}",
        "event:thinkingProcess\ndata:{\"content\":\"限制\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"比如\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"探测器\"}",
        "event:thinkingProcess\ndata:{\"content\":\"的作用\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"以及\"}",
        "event:thinkingProcess\ndata:{\"content\":\"相关\"}",
        "event:thinkingProcess\ndata:{\"content\":\"数据的\"}",
        "event:thinkingProcess\ndata:{\"content\":\"来源\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"比如\"}",
        "event:thinkingProcess\ndata:{\"content\":\"NASA\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"网站\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\\n\\n\"}",
        "event:thinkingProcess\ndata:{\"content\":\"还要\"}",
        "event:thinkingProcess\ndata:{\"content\":\"确保\"}",
        "event:thinkingProcess\ndata:{\"content\":\"回答\"}",
        "event:thinkingProcess\ndata:{\"content\":\"有帮助\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可能\"}",
        "event:thinkingProcess\ndata:{\"content\":\"建议\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"访问\"}",
        "event:thinkingProcess\ndata:{\"content\":\"NASA\"}",
        "event:thinkingProcess\ndata:{\"content\":\"官网\"}",
        "event:thinkingProcess\ndata:{\"content\":\"获取\"}",
        "event:thinkingProcess\ndata:{\"content\":\"最新\"}",
        "event:thinkingProcess\ndata:{\"content\":\"信息\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"或者\"}",
        "event:thinkingProcess\ndata:{\"content\":\"解释\"}",
        "event:thinkingProcess\ndata:{\"content\":\"火星\"}",
        "event:thinkingProcess\ndata:{\"content\":\"天气\"}",
        "event:thinkingProcess\ndata:{\"content\":\"监测\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"现状\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"比如\"}",
        "event:thinkingProcess\ndata:{\"content\":\"毅力\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"探测\"}",
        "event:thinkingProcess\ndata:{\"content\":\"器的\"}",
        "event:thinkingProcess\ndata:{\"content\":\"实时\"}",
        "event:thinkingProcess\ndata:{\"content\":\"数据\"}",
        "event:thinkingProcess\ndata:{\"content\":\"更新\"}",
        "event:thinkingProcess\ndata:{\"content\":\"情况\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"同时\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"保持\"}",
        "event:thinkingProcess\ndata:{\"content\":\"回答\"}",
        "event:thinkingProcess\ndata:{\"content\":\"简洁\"}",
        "event:thinkingProcess\ndata:{\"content\":\"易懂\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"避免\"}",
        "event:thinkingProcess\ndata:{\"content\":\"使用\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"专业的\"}",
        "event:thinkingProcess\ndata:{\"content\":\"术语\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"用户\"}",
        "event:thinkingProcess\ndata:{\"content\":\"明白\"}",
        "event:thinkingProcess\ndata:{\"content\":\"虽然\"}",
        "event:thinkingProcess\ndata:{\"content\":\"现在\"}",
        "event:thinkingProcess\ndata:{\"content\":\"不能\"}",
        "event:thinkingProcess\ndata:{\"content\":\"实时\"}",
        "event:thinkingProcess\ndata:{\"content\":\"提供\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\"}",
        "event:thinkingProcess\ndata:{\"content\":\"但有\"}",
        "event:thinkingProcess\ndata:{\"content\":\"途径\"}",
        "event:thinkingProcess\ndata:{\"content\":\"可以\"}",
        "event:thinkingProcess\ndata:{\"content\":\"获取\"}",
        "event:thinkingProcess\ndata:{\"content\":\"这些\"}",
        "event:thinkingProcess\ndata:{\"content\":\"信息\"}",
        "event:thinkingProcess\ndata:{\"content\":\"\\n\"}",
        "event:finalResult\ndata:{\"content\":\"\\n\\n\"}",
        "event:finalResult\ndata:{\"content\":\"目前\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"无法\"}",
        "event:finalResult\ndata:{\"content\":\"实时\"}",
        "event:finalResult\ndata:{\"content\":\"获取\"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"天气\"}",
        "event:finalResult\ndata:{\"content\":\"数据\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"可以通过\"}",
        "event:finalResult\ndata:{\"content\":\"以下\"}",
        "event:finalResult\ndata:{\"content\":\"信息\"}",
        "event:finalResult\ndata:{\"content\":\"帮助你\"}",
        "event:finalResult\ndata:{\"content\":\"了解\"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"天气\"}",
        "event:finalResult\ndata:{\"content\":\"相关的\"}",
        "event:finalResult\ndata:{\"content\":\"知识\"}",
        "event:finalResult\ndata:{\"content\":\"\\n\\n\"}",
        "event:finalResult\ndata:{\"content\":\"1\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\" **\"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"天气\"}",
        "event:finalResult\ndata:{\"content\":\"特点\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"  \\n\"}",
        "event:finalResult\ndata:{\"content\":\"   \"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"大气\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"主要\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"分为\"}",
        "event:finalResult\ndata:{\"content\":\"二氧化碳\"}",
        "event:finalResult\ndata:{\"content\":\"),\"}",
        "event:finalResult\ndata:{\"content\":\"平均\"}",
        "event:finalResult\ndata:{\"content\":\"温度\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"-\"}",
        "event:finalResult\ndata:{\"content\":\"63\"}",
        "event:finalResult\ndata:{\"content\":\"℃,\"}",
        "event:finalResult\ndata:{\"content\":\"昼夜\"}",
        "event:finalResult\ndata:{\"content\":\"温差\"}",
        "event:finalResult\ndata:{\"content\":\"极大\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"白天\"}",
        "event:finalResult\ndata:{\"content\":\"可能\"}",
        "event:finalResult\ndata:{\"content\":\"接近\"}",
        "event:finalResult\ndata:{\"content\":\"0\"}",
        "event:finalResult\ndata:{\"content\":\"℃,\"}",
        "event:finalResult\ndata:{\"content\":\"夜晚\"}",
        "event:finalResult\ndata:{\"content\":\"降至\"}",
        "event:finalResult\ndata:{\"content\":\"-\"}",
        "event:finalResult\ndata:{\"content\":\"80\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"以下\"}",
        "event:finalResult\ndata:{\"content\":\")。\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"发生\"}",
        "event:finalResult\ndata:{\"content\":\"区域性\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"可能\"}",
        "event:finalResult\ndata:{\"content\":\"持续\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"甚至\"}",
        "event:finalResult\ndata:{\"content\":\"覆盖\"}",
        "event:finalResult\ndata:{\"content\":\"整个\"}",
        "event:finalResult\ndata:{\"content\":\"星球\"}",
        "event:finalResult\ndata:{\"content\":\"\\n\\n\"}",
        "event:finalResult\ndata:{\"content\":\"2\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\" **\"}",
        "event:finalResult\ndata:{\"content\":\"数据\"}",
        "event:finalResult\ndata:{\"content\":\"来源\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"  \\n\"}",
        "event:finalResult\ndata:{\"content\":\"   \"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"探测器\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"毅力\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"”“\"}",
        "event:finalResult\ndata:{\"content\":\"好奇\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"”)\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"局部\"}",
        "event:finalResult\ndata:{\"content\":\"气象\"}",
        "event:finalResult\ndata:{\"content\":\"数据\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"包括\"}",
        "event:finalResult\ndata:{\"content\":\"温度\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"风速\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"气压\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"例如\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"毅力\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"所在的\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"J\"}",
        "event:finalResult\ndata:{\"content\":\"ez\"}",
        "event:finalResult\ndata:{\"content\":\"ero\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"近期\"}",
        "event:finalResult\ndata:{\"content\":\"记录\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"白天\"}",
        "event:finalResult\ndata:{\"content\":\"-\"}",
        "event:finalResult\ndata:{\"content\":\"20\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"夜间\"}",
        "event:finalResult\ndata:{\"content\":\"-\"}",
        "event:finalResult\ndata:{\"content\":\"80\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"的温度\"}",
        "event:finalResult\ndata:{\"content\":\"波动\"}",
        "event:finalResult\ndata:{\"content\":\"\\n\\n\"}",
        "event:finalResult\ndata:{\"content\":\"3\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\" **\"}",
        "event:finalResult\ndata:{\"content\":\"实时\"}",
        "event:finalResult\ndata:{\"content\":\"查询\"}",
        "event:finalResult\ndata:{\"content\":\"建议\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"  \\n\"}",
        "event:finalResult\ndata:{\"content\":\"   \"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"访问\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"NASA\"}",
        "event:finalResult\ndata:{\"content\":\"官网\"}",
        "event:finalResult\ndata:{\"content\":\"**\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"例如\"}",
        "event:finalResult\ndata:{\"content\":\"[\"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"探测\"}",
        "event:finalResult\ndata:{\"content\":\"任务\"}",
        "event:finalResult\ndata:{\"content\":\"页面\"}",
        "event:finalResult\ndata:{\"content\":\"](\"}",
        "event:finalResult\ndata:{\"content\":\"https\"}",
        "event:finalResult\ndata:{\"content\":\"://\"}",
        "event:finalResult\ndata:{\"content\":\"mars\"}",
        "event:finalResult\ndata:{\"content\":\".nasa\"}",
        "event:finalResult\ndata:{\"content\":\".gov\"}",
        "event:finalResult\ndata:{\"content\":\"/)\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"关注\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"好奇\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"探测\"}",
        "event:finalResult\ndata:{\"content\":\"器的\"}",
        "event:finalResult\ndata:{\"content\":\"社交媒体\"}",
        "event:finalResult\ndata:{\"content\":\"账号\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"这些\"}",
        "event:finalResult\ndata:{\"content\":\"平台\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"定期\"}",
        "event:finalResult\ndata:{\"content\":\"更新\"}",
        "event:finalResult\ndata:{\"content\":\"火星\"}",
        "event:finalResult\ndata:{\"content\":\"天气\"}",
        "event:finalResult\ndata:{\"content\":\"报告\"}",
        "event:finalResult\ndata:{\"content\":\"\\n\\n\"}",
        "event:finalResult\ndata:{\"content\":\"需要\"}",
        "event:finalResult\ndata:{\"content\":\"其他\"}",
        "event:finalResult\ndata:{\"content\":\"帮助\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"例如\"}",
        "event:finalResult\ndata:{\"content\":\"具体\"}",
        "event:finalResult\ndata:{\"content\":\"日期\"}",
        "event:finalResult\ndata:{\"content\":\"的历史\"}",
        "event:finalResult\ndata:{\"content\":\"数据\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"科学\"}",
        "event:finalResult\ndata:{\"content\":\"分析\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"可以\"}",
        "event:finalResult\ndata:{\"content\":\"告诉我\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:finalResult\ndata:{\"content\":\"我会\"}",
        "event:finalResult\ndata:{\"content\":\"尽力\"}",
        "event:finalResult\ndata:{\"content\":\"提供\"}",
        "event:finalResult\ndata:{\"content\":\"参考资料\"}",
        "event:finalResult\ndata:{\"content\":\"\"}",
        "event:done\ndata:done"
    )

}

毕竟模拟数据写死的,后台返的数据是这样的

https://i-blog.csdnimg.cn/direct/b03102e2cd2b463bacb7dfea1a384bcd.png