Arhn - архитектура программирования

Как загрузить данные с помощью потоковой передачи?

Мое приложение используется для сохранения данных датчика и загрузки на сервер.

Во-первых, у меня есть эти данные.

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

Если данных мало, проблем нет, но если данных много, приложение вылетает.

Выбрасывание OutOfMemoryError «Не удалось выделить 150994952 байта с 25165824 свободными байтами и 86 МБ до OOM, максимально допустимый размер 135855256, предел роста 201326592»

Я нашел какой-то ответ, они предлагают использовать потоковую передачу

java.lang. OutOfMemoryError: пространство кучи Java при попытке преобразовать объект Java в строку Json

Но я не понимаю, как использовать потоковую передачу для загрузки моего объекта


  • Добавьте android:largeHeap=true в приложение в файле манифеста. 22.01.2019
  • Все еще OutOfMemoryError 22.01.2019

Ответы:


1

Retrofit имеет MultiPartBody загрузку, например, с помощью POST. Пример с File байтами:

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

И тогда Сервис примет этот MultiPartBody

uploadService.postImageFile(session, body)

Метод в интерфейсе будет выглядеть так

@Multipart
@POST("file/put")
Call<ResponseBody> postImageFile(
    @Part("T") String token,
    @Part MultipartBody.Part file);
22.01.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..