Autore Topic: JSON e lettura record da database mysql  (Letto 2279 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
JSON e lettura record da database mysql
« il: 29 Settembre 2011, 23:59:41 CEST »
0
Ciao a tutti, ho un piccolo problema perchè cerco di leggere dal mio database mysql tramite una pagina php tutti i record presenti nella tabella prodotti, però dato che sono circa 4800 record quando mi torna indietro il JSON mi dà l'eccezione Out of Memory vi posto il codice :
Codice (Java): [Seleziona]
@Override
        protected String doInBackground(Void... params) {
            try{
                httpclient = new DefaultHttpClient();
                HttpGet httpget = new HttpGet("http://www.mysite.com/preleva_prodotti.php");        
                HttpResponse response = httpclient.execute(httpget);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
            }catch(Exception e){
                //Log.e("log_tag", "Error in http connection "+ e.toString());
                httpclient.getConnectionManager().shutdown();
                return result = "no_server";
            }
 
            //convert response to string
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
            }catch(Exception e){
                return result = "no_server";
            }
            //parse json data
            try{
                JSONObject json= new JSONObject(result);
                JSONArray jArray = json.getJSONArray("array");
                            return is_full="ok_insert";
            }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
                return is_full = "no_dati";
            }
        }

in pratica l'errore viene segnalato sulla riga  sb.append(line + "\n"); suppongo perchè 4800 record sono tanti però non capiasco come ovviare al problema...qualcuno mi sà dare una mano ?

Grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:JSON e lettura record da database mysql
« Risposta #1 il: 30 Settembre 2011, 01:13:18 CEST »
0
Già che usi il + dentro lo StringBuilder in qualche modo vanifichi il suo vantaggio. Inizia a cambiare:

Codice (Java): [Seleziona]
sb.append(line + "\n");
in

Codice (Java): [Seleziona]
sb.append(line);
sb.append("\n");


Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:JSON e lettura record da database mysql
« Risposta #2 il: 30 Settembre 2011, 01:58:03 CEST »
0
Ciao Ricky grazie per la risposta, ho cambiato ma il problema persiste...è come se il ciclo while andasse in loop...ma siamo sicuri che while ((line = reader.readLine()) != null) { sia esatto ?? ???

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:JSON e lettura record da database mysql
« Risposta #3 il: 30 Settembre 2011, 10:43:01 CEST »
+1
Prova ad utilizzare l'handler di default per leggere la risposta al tuo get:

Codice (Java): [Seleziona]
@Override
        protected String doInBackground(Void... params) {
                        String result = "";
            try{
                httpclient = new DefaultHttpClient();
                HttpGet httpget = new HttpGet("http://www.mysite.com/preleva_prodotti.php");        
                                BasicResponseHandler responseHandler = new BasicResponseHandler();
                                String response = httpClient.execute(httpget, responseHandler);

            }catch(Exception e){
                //Log.e("log_tag", "Error in http connection "+ e.toString());
                httpclient.getConnectionManager().shutdown();
                return result = "no_server";
            }
            //parse json data
            try{
                JSONObject json= new JSONObject(result);
                JSONArray jArray = json.getJSONArray("array");
                            return is_full="ok_insert";
            }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
                return is_full = "no_dati";
            }
        }

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:JSON e lettura record da database mysql
« Risposta #4 il: 30 Settembre 2011, 12:23:43 CEST »
0
Grande Ricky funziona !! :) visto che sei ferrato nell'argomento posso chiederti se è possibile fare questo : mentre si riceve byte per byte l'array json con tutti i 5000 record vorrei far visualizzare una progressdialog con la percentuale di avanzamento. Mi chiedo se esiste un modo per sapere quando è grande in bytes l'array json che stò ricevendo e soprattutto quanti bytes vengono downloadati istante per istante in modo da aggiornare la percentuale della progressdialog.

Grazie ! intento rep+ ;)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:JSON e lettura record da database mysql
« Risposta #5 il: 30 Settembre 2011, 12:37:43 CEST »
0
Grande Ricky funziona !! :) visto che sei ferrato nell'argomento posso chiederti se è possibile fare questo : mentre si riceve byte per byte l'array json con tutti i 5000 record vorrei far visualizzare una progressdialog con la percentuale di avanzamento. Mi chiedo se esiste un modo per sapere quando è grande in bytes l'array json che stò ricevendo e soprattutto quanti bytes vengono downloadati istante per istante in modo da aggiornare la percentuale della progressdialog.

Grazie ! intento rep+ ;)

Uhm, se la riposta http contiene l'header "Content-Length" potresti leggere quello ;)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:JSON e lettura record da database mysql
« Risposta #6 il: 30 Settembre 2011, 13:43:34 CEST »
0
Uhm, se la riposta http contiene l'header "Content-Length" potresti leggere quello ;)

Si per la lunghezza totale in effetti...ma non mi serve a nulla se non c'è una funzione che mi dice i byte che vengono scaricati secondo per secondo....

Offline duka

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    Win 7
Re:JSON e lettura record da database mysql
« Risposta #7 il: 13 Agosto 2012, 10:08:44 CEST »
0
scusate l'ignoranza.
e da settimane che sto provando far funzionare una app che recupera i dati dal PHP (JSON).
Ma ogni volta mi da il risultato vuoto e senza errori.

Siccome questo mi pare un esempio valido, mi fate vedere qualche riga in più che capisco perché non funziona.

Tipo ("protected String doInBackground(Void... params) {
                        String result = "";" ) cosa ci va.?