Android Http Пост потокового JSON - PullRequest
       10

Android Http Пост потокового JSON

0 голосов
/ 14 сентября 2011

Я столкнулся с проблемой при попытке отправить данные SQLite на веб-сервер с помощью json (gson).Все было хорошо, пока стол не обошел 6000 рядов.Я столкнулся с ошибками нехватки памяти.

В моем хранилище данных у меня есть:

public String DonneesToJson (SQLiteDatabase db, int chantier, int chantier_serveur )
{
    Cursor c = db.rawQuery("select * from "+P_TABLE+" where "+P_CHANTIER+"="+chantier+ " order by "+P_TIME+" desc ", null);

    List<Donnees> donnees = new ArrayList<Donnees>();
    c.moveToFirst();

    while (c.moveToNext())
    {
        Donnees d = new Donnees (
                c.getInt(c.getColumnIndex(Datahelper.P_ID)),
                chantier_serveur,
                offset,
                c.getInt(c.getColumnIndex(Datahelper.P_PLAN)),
                c.getString(c.getColumnIndex(Datahelper.P_TIME)),
                c.getInt(c.getColumnIndex(Datahelper.P_PRESSION)),
                c.getInt(c.getColumnIndex(Datahelper.P_PROFONDEUR)),
                c.getInt(c.getColumnIndex(Datahelper.P_PROFONDEUR_TOTALE)),
                c.getInt(c.getColumnIndex(Datahelper.P_ANGLE_X)),
                c.getInt(c.getColumnIndex(Datahelper.P_ANGLE_Y)),
                c.getString(c.getColumnIndex(Datahelper.P_PIEU)),
                c.getInt(c.getColumnIndex(Datahelper.P_NO_RALLONGE)),
                c.getString(c.getColumnIndex(Datahelper.P_RALLONGE)),
                c.getInt(c.getColumnIndex(Datahelper.P_MOTEUR)),
                c.getString(c.getColumnIndex(Datahelper.P_SERIE)),
                c.getDouble(c.getColumnIndex(Datahelper.P_COEFF_A)),
                c.getDouble(c.getColumnIndex(Datahelper.P_COEFF_B))
        );
        donnees.add(d);
    }

    c.close();

    Gson gson = new Gson();

    return gson.toJson(donnees);
}

В основном я называю это так:

String resultat = dbHelper.DonneesToJson(db,i, chantier_serveur);

HttpPost post2 = new HttpPost("http://www.zzzzzzz.com/test.php");
StringEntity se = new StringEntity(resultat);  
se.setContentEncoding( new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post2.setEntity(se);
response = client.execute(post2);

На стороне сервера,это довольно простой php для хранения данных в большой БД sql и последующего анализа.

, то есть: $decoded = json_decode($HTTP_RAW_POST_DATA,true); foreach ( $decoded as $key => $value) { $query = ...

Во время выполнения ошибок OOM, это медленно.Я имею в виду, что передача данных sql в json идет медленно.

Я пытался идти по маршруту Джексона, быстрее, без ошибок памяти, но ... он может только записывать в файл или поток.Я бы постарался избежать записи в файл, а затем отправить файл через сообщение http.Поэтому я решил открыть поток http для отправки данных JSON, и я застрял.Я не нашел ни одного примера того, как открыть поток вывода на веб-сервер с помощью apache.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 14 сентября 2011

Несмотря на ответ dmon на разбиение данных на пакеты, вы должны работать над другими сбоями. Попробуйте этот код:

public String DonneesToJson (SQLiteDatabase db, int chantier, int chantier_serveur ) {
    Cursor c = db.rawQuery("select * from "+P_TABLE+" where "+P_CHANTIER+"="+chantier+ " order by "+P_TIME+" desc ", null);

    List<Donnees> donnees = new ArrayList<Donnees>();
    if (c != null) { // nullcheck as rawQuery can return null!
        Donnees d; // reuse variables for loops
        while (c.moveToNext()) { // was buggy before, read comment below code
            d = new Donnees (
                c.getInt(c.getColumnIndex(Datahelper.P_ID)),
                chantier_serveur,
                offset,
                c.getInt(c.getColumnIndex(Datahelper.P_PLAN)),
                c.getString(c.getColumnIndex(Datahelper.P_TIME)),
                c.getInt(c.getColumnIndex(Datahelper.P_PRESSION)),
                c.getInt(c.getColumnIndex(Datahelper.P_PROFONDEUR)),
                c.getInt(c.getColumnIndex(Datahelper.P_PROFONDEUR_TOTALE)),
                c.getInt(c.getColumnIndex(Datahelper.P_ANGLE_X)),
                c.getInt(c.getColumnIndex(Datahelper.P_ANGLE_Y)),
                c.getString(c.getColumnIndex(Datahelper.P_PIEU)),
                c.getInt(c.getColumnIndex(Datahelper.P_NO_RALLONGE)),
                c.getString(c.getColumnIndex(Datahelper.P_RALLONGE)),
                c.getInt(c.getColumnIndex(Datahelper.P_MOTEUR)),
                c.getString(c.getColumnIndex(Datahelper.P_SERIE)),
                c.getDouble(c.getColumnIndex(Datahelper.P_COEFF_A)),
                c.getDouble(c.getColumnIndex(Datahelper.P_COEFF_B)));
            donnees.add(d);
        }
        c.close();
    }
    return new Gson().toJson(donnees);
}

Ваша текущая реализация содержит ошибки, и вы никогда не получите первую запись. Причиной этого является ваш звонок на moveToFirst(), который перемещает вас к первому. Цикл while переместит внутренний указатель на вторую запись с moveToNext(), что приведет к запуску со вторым элементом и полному игнорированию первого. Всегда и навсегда ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...