You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin保存安卓光线传感器数据到JSON时重复写入多数组问题

问题根因

你遇到的两个异常分别由两个代码逻辑错误导致:

  • 数值重复:你将jsonObject定义为全局单例,每次传感器回调时都是修改同一个JSONObject实例的数值再加入数组。JSONArray存储的是对象引用,所有加入数组的元素本质上都是同一个对象,最终所有元素的值都会被更新为最后一次采集的光线值,出现重复。
  • 文件存在多个独立JSON数组:每次传感器触发回调时,你都把当前累积状态的整个jsonArray转成字符串写入文件。第一次写入长度为1的数组,第二次写入长度为2的数组,多次写入的内容直接拼接在文件中,自然会出现多个独立数组,不符合合法JSON格式。
修复步骤
  • 删除全局的jsonObject变量,不需要全局持有单个数据对象。每次传感器回调拿到新的光线值时,新建独立的JSONObject存储当前读数,再加入数组,从根源避免对象复用导致的值重复问题。
  • 移除onSensorChanged方法中的文件写入逻辑。传感器回调触发频率很高,频繁写入既浪费性能,还会导致重复写整个数组的问题。你只需要在回调中完成内存中数组的更新即可,等采集结束(比如页面销毁、用户手动点击停止采集按钮时),再把完整的JSONArray一次性转成字符串写入文件。
  • 写入完成后记得调用flush()方法刷流,避免部分数据残留在缓冲区没有写入磁盘。
修正后的核心代码
// 直接删除全局的 lateinit var jsonObject: JSONObject 定义,不需要这个变量

override fun onSensorChanged(p0: SensorEvent?) {
    if (p0?.sensor?.type == Sensor.TYPE_LIGHT) {
        val lightText: TextView = findViewById(R.id.light_Sensor)
        val currentValue = p0.values[0]
        lightText.text = "Light Value  = $currentValue"

        // 每次采集新建独立JSONObject
        val singleData = JSONObject()
        singleData.put("light value", currentValue)
        jsonArray.put(singleData)
        // 不要在这里执行文件写入操作
    }
}

override fun onDestroy() {
    // 采集结束一次性写入完整JSON数组
    bufferedWriter.write(jsonArray.toString())
    bufferedWriter.flush()
    bufferedWriter.close()
    sensorManager.unregisterListener(this)
    super.onDestroy()
}

补充提示:光线传感器默认采样率很高,如果你不需要高频采集,可以加时间节流逻辑(比如间隔200ms以上才记录一次数据),避免生成的文件体积过大。

内容的提问来源于stack exchange,提问作者Gourav Sen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:18:51