最近特别火的非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 |
---|---|---|
方向 | 单向(服务器→客户端) | 全双工 |
协议 | HTTP | ws/wss |
数据格式 | 文本流 | 二进制 / 文本 |
浏览器支持 | 原生支持 | 需 JS 实现 |
典型应用场景
实时通知(新闻推送、消息提醒)
股票行情更新
日志监控系统
在线协作编辑
注意事项
处理连接中断:需实现重连机制
内存管理:避免长时间占用资源
数据解析:注意处理分块传输编码
线程安全:确保 UI 更新在主线程
在 Android 开发中,建议使用okhttp或Retrofit库处理 EventStream,配合协程或 RxJava 进行异步处理,保证主线程不阻塞。对于复杂场景,可封装 SSE 客户端类,实现自动重连、事件分发等功能。
EventStream 的关键点
基于 HTTP,使用 text/event-stream 媒体类型,每个事件由多个字段组成,如 id、event、data 等,支持分块传输,适合实时更新。同时,要提到与 WebSocket 的区别,比如 SSE 是单向的,而 WebSocket 是全双工的,这样用户能更好地理解适用场景。
效果图
网页版
APP端
开始实现
一、自定义TextView
package com.example.testdemoimport 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.AppCompatTextViewclass 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 = 0private val normalTextColor = Color.parseColor("#8A9098") // 非加粗文本颜色init {movementMethod = ScrollingMovementMethod()highlightColor = resources.getColor(android.R.color.transparent, null)isClickable = trueisFocusable = trueisLongClickable = 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 = falsevar startIndex = 0for (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 = falsestartIndex = i + 2} else {// 开始加粗val normalText = content.substring(startIndex, i)addTextWithStyle(normalText, false)isBold = truestartIndex = 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.lengthcontentBuilder.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.firstval 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.BLUEds.isUnderlineText = true}},start,start + linkText.length,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)}}private fun handleNewLine() {val lineBreaks = contentBuilder.toString().split("\n").size - 1if (lineBreaks > 0) {currentLineStart = contentBuilder.length - lineBreakscontentBuilder.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.BLACKds.typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD)}}// 重写 onTouchEvent 方法,确保点击事件传递到 ClickableSpanoverride fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {// 处理点击按下事件val x = event.x.toInt()val y = event.y.toInt()val layout = layoutval 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.testdemoimport 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.dataprivate var typingSpeed = 100L // 默认打字速度,单位为毫秒fun startProcessing() {var index = 0val 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.NestedScrollViewandroid: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.DeepSeekTextViewandroid: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><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/black" /><Buttonandroid:id="@+id/startButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击开始思考"android:textSize="16sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/clearButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="清空内容"android:textSize="16sp" /><Buttonandroid: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.testdemoimport 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.Toastclass 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 ClipboardManagerval 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")}