簡體   English   中英

Android Http Post流json

[英]Android Http Post streaming json

我在嘗試使用json(gson)將SQLite數據發送到Web服務器時遇到麻煩。 一切都很好,直到桌子轉了6000行。 我遇到了“內存不足”錯誤。

在我的datahelper中,我有:

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

在服務器端,將數據存儲在大型sql DB中然后進行分析是相當基本的php。

即: $decoded = json_decode($HTTP_RAW_POST_DATA,true); foreach ( $decoded as $key => $value) { $query = ... $decoded = json_decode($HTTP_RAW_POST_DATA,true); foreach ( $decoded as $key => $value) { $query = ...

在執行OOM錯誤時,速度很慢。 我的意思是將sql數據獲取到json速度很慢。

我嘗試走傑克遜路線,速度更快,沒有內存不足錯誤,但是...它只能寫入文件或流。 我會盡量避免寫入文件,然后通過http帖子發送文件。 因此,我決定打開一個HTTP流以發送json數據,但被卡住了。 我沒有找到關於如何使用apache打開到Web服務器的輸出流的任何示例。

任何幫助表示贊賞。

盡管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()將內部指針移動到第二個條目,這將導致從第二個元素開始,而完全忽略第一個元素。 永遠永遠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM