Мое приложение используется для сохранения данных датчика и загрузки на сервер.
Сначала у меня есть эти данные.
data class SensorRecord (val upDown:String,
val config:Int,
val date: Date,
val ms: Int,
val dur: Int,
public var v:MutableList<SensorValue>
)
data class SensorValue (var accelerometer:Accelerometer? = null,
var gyroscope:Gyroscope? = null,
var gravity:Gravity? = null,
var magnetic:Magnetic? = null,
var linearAcceleration:LinearAcceleration? = null,
var rotationVector:RotationVector? = null,
var gameRotationVector:GameRotationVector? = null,
var pressure:Pressure? = null,
var orientation:Orientation? = null
){
data class Accelerometer(var x:Float,
var y:Float,
var z:Float
)
data class Gyroscope(var x:Float,
var y:Float,
var z:Float
)
data class Gravity(var x:Float,
var y:Float,
var z:Float
)
data class Magnetic(var x:Float,
var y:Float,
var z:Float
)
data class LinearAcceleration(var x:Float,
var y:Float,
var z:Float
)
data class RotationVector(var x:Float,
var y:Float,
var z:Float,
var scalar:Float
)
data class GameRotationVector(var x:Float,
var y:Float,
var z:Float
)
data class Pressure(var hpa:Float)
data class Orientation(var azimuth:Float,
var pitch:Float,
var roll:Float)
}
А затем добавить много значений в список, чтобы данные были очень большими.
var record:SensorRecord? = null
record = SensorRecord(upDown, config, Date(), ms.toInt(), duration.toInt(), arrayListOf<SensorValue>())
record!!.v.add(sensorValue)
record!!.v.add(sensorValue)
record!!.v.add(sensorValue)
record!!.v.add(sensorValue)
.
.
.
.
add many data
Наконец загрузить на сервер
fun upload(){
val gson = GsonBuilder()
.setDateFormat("yyyy-MM-dd HH-mm-ss")
.create();
var jsonString = gson.toJson(record)
val requestQueue = Volley.newRequestQueue(applicationContext)
val stringRequest = object : StringRequest(Request.Method.POST, "http://myupload.com",
object : Response.Listener<String> {
override fun onResponse(response: String) {
}
},
object : Response.ErrorListener {
override fun onErrorResponse(error: VolleyError) {
}
})
{
override fun getParams(): Map<String, String> {
val params = HashMap<String, String>()
params["record"] = jsonString
return params
}
}
requestQueue.add(stringRequest)
}
Если данные маленькие, проблем нет, но если данные большие, приложение вылетает.
Throwing OutOfMemoryError "Не удалось выделить 150994952 байт
выделение с 25165824 свободных байтов и 86 МБ до OOM, максимально допустимое
след 135855256, предел роста 201326592 "
Я нашел какой-то ответ, они предлагают использовать потоковую передачу
java.lang.OutOfMemoryError: пространство кучи Java при попытке преобразовать объект Java в строку Json
Но я не понимаю, как использовать потоковую передачу для загрузки моего объекта