共计 2202 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
移动端集成 ChatGPT 与桌面端有显著差异,主要体现在三个核心挑战上:

- 网络不稳定性:移动网络存在信号波动、基站切换等问题,导致 API 请求更容易超时或中断
- 会话管理复杂度:手机应用常被切换到后台,需要妥善保存对话上下文
- Token 成本控制:移动端屏幕尺寸限制要求更精细的 Token 分配策略
技术选型
REST API 方案
- 优点:实现简单,兼容性广(所有移动端框架都支持)
- 缺点:长对话时延迟明显,需要自己维护对话历史
WebSocket 方案
- 优点:适合持续对话场景,实时性更好
- 缺点:需要处理连接保活,安卓端存在后台限制
建议:普通问答场景用 REST,持续对话场景用 WebSocket
核心实现
Android(Kotlin)示例
// 使用 OkHttp 实现带重试的请求
val client = OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.addInterceptor(RetryInterceptor(maxRetries = 3))
.build()
fun callChatGPT(prompt: String) {val json = """{"model":"gpt-3.5-turbo","messages": [{"role":"user","content":"$prompt"}]
}""".trimIndent()
val request = Request.Builder()
.url("https://api.openai.com/v1/chat/completions")
.post(json.toRequestBody("application/json".toMediaType()))
.addHeader("Authorization", "Bearer ${secureStorage.getAPIKey()}")
.build()
// 使用协程避免主线程阻塞
lifecycleScope.launch(Dispatchers.IO) {
try {val response = client.newCall(request).execute()
if (response.isSuccessful) {val result = parseResponse(response.body?.string())
withContext(Dispatchers.Main) {updateUI(result)
}
}
} catch (e: Exception) {showRetryDialog()
}
}
}
对话状态管理
推荐采用 MVI 架构:
-
定义密封类表示对话状态
sealed class ChatState {object Idle : ChatState() data class Loading(val prompt: String) : ChatState() data class Success(val messages: List<Message>) : ChatState() data class Error(val msg: String) : ChatState()} -
使用 ViewModel 保存对话历史
class ChatViewModel : ViewModel() {private val _messages = mutableStateListOf<Message>() val messages: List<Message> get() = _messages fun addUserMessage(text: String) {_messages.add(Message(role = "user", content = text)) } fun addBotMessage(text: String) {_messages.add(Message(role = "assistant", content = text)) } }
性能优化
缓存策略三要素
- 对话缓存:SQLite 存储最近 10 组对话
- 响应缓存:相同问题结果缓存 5 分钟
- 图片缓存:使用 Coil/Glide 的磁盘缓存
请求节流方案
// 使用 Debounce 防止快速连续发送
searchView.debounce(500)
.onEach { query ->
if (query.length > 2) {viewModel.search(query)
}
}
.launchIn(lifecycleScope)
安全实践
API 密钥存储
- 安卓:使用 Jetpack Security 加密后存 SharedPreferences
- iOS:使用 Keychain Services
数据清理
// 应用退到后台时清理敏感数据
override fun onPause() {super.onPause()
secureStorage.clearTempData()}
避坑指南
- 中文乱码问题:确保请求头包含
Charset: UTF-8 - 长回复截断:检查 max_tokens 参数(建议手机端设为 800)
- 后台被杀:使用 WorkManager 处理未完成请求
- Token 超限 :实时计算已用 Token(可用
tiktoken库)
进阶思考
结合移动设备特性的改进方向:
- 语音输入集成:通过
SpeechRecognizer实现语音转文字 - 位置感知:根据 GPS 数据提供场景化回复
- 离线缓存:预加载常见问题回答模板
思考题
如何设计一个在弱网环境下仍能流畅使用的 AI 对话系统?可以考虑以下方向:
- 本地预生成部分回复内容
- 建立 P2P 的消息中转网络
- 使用差分更新技术减少数据传输量
正文完
