【问题标题】:How to upload data using streaming?如何使用流媒体上传数据?
【发布时间】:2019-06-15 18:48:33
【问题描述】:

我的应用程序用于保存传感器数据并上传到服务器。

首先我有这些数据。

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)
}

然后在list中添加很多值,所以数据很大。

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)
}

数据小没问题,数据大了应用就崩溃了。

抛出 OutOfMemoryError "未能分配 150994952 字节 分配 25165824 个空闲字节和 86MB 直到 OOM,最大允许 足迹135855256,增长极限201326592"

我找到了一些答案,他们建议使用流媒体

java.lang.OutOfMemoryError: Java heap space when try to convert Java Object to Json String

但我不明白如何使用流式传输来上传我的对象

【问题讨论】:

  • 在清单文件的应用程序中添加 android:largeHeap="true"
  • Still OutOfMemoryError

标签: android json gson out-of-memory jsonstream


【解决方案1】:

RetrofitMultiPartBody 上传,例如使用 POST。 File 字节示例:

val fbody = RequestBody.create(MediaType.parse("image/*"), img) // img is File
val body = MultipartBody.Part.createFormData("file", img.getName(), fbody)

然后 Service 会接受这个 MultiPartBody

uploadService.postImageFile(session, body)

接口中的方法如下所示

@Multipart
@POST("file/put")
Call<ResponseBody> postImageFile(
    @Part("T") String token,
    @Part MultipartBody.Part file);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多