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
相关产品推荐
相关产品推荐

