Android: Connessione a MySQL usando PHP

Il motivo principale per l’adozione di un linguaggio di scripting come PHP è dovuto all’interazione con i database.

In questo tutorial vi mostrerò come utilizzare PHP e database MySQL per recuperare informazioni dal server. Per effettuare il collegamento a script PHP, utilizzeremo il protocollo HTTP dal sistema android. Inutile dirvi che comunque per implementare questo tutorial si dovrebbe avere una conoscenza di base di come eseguire script PHP e avviare il server. Se parliamo di architettura client-server, il dispositivo client è l’Android e lato server vi è una combinazione di script PHP e MySQL.

Durante il tutorial useremo un formato importantissimo per lo scambio leggero dei dati, ossia il formato JSON (JavaScript Object Notation).

Piccola premessa sul JSON:

Si basa su un sottoinsieme del Linguaggio di Programmazione JavaScriptStandard ECMA-262 Terza Edizione – Dicembre 1999 (testo sito json). JSON è un formato di testo completamente indipendente dal linguaggio di programmazione, ma utilizza convenzioni conosciute dai programmatori di linguaggi della famiglia del C, come C, C++, C#, Java, JavaScript, Perl, Python, e molti altri. Questa caratteristica fa di JSON un linguaggio ideale per lo scambio di dati.

JSON è basato su due strutture:

  • Un insieme di coppie nome/valore. In diversi linguaggi, questo è realizzato come un oggetto, un record, uno struct, un dizionario, una tabella hash, un elenco di chiavi o un array associativo.
  • Un elenco ordinato di valori. Nella maggior parte dei linguaggi questo si realizza con un array, un vettore, un elenco o una sequenza.

Come farà la nostra applicazione ad usare json?

Quando l’applicazione Android effettuerà la richiesta alla pagina PHP e rimarrà in attesa. Lo script PHP, si connetterà al DB, invierà la query, recupererà la risposta, inserirà la risposta in un oggetto json e lo darà come output. Questo output sarà codificato in formato JSON e inviato al dispositivo. L’applicazione Android otterrà questi dati codificati, li analizzerà e li visualizzerà sul dispositivo Android.

Implementiamo il tutto:

In MySQL creare il database TSA_Evolution, creare tabella Stock. Questa tabella consiste di due colonne. In primo luogo è Stock_id, che è auto_increment e primary_key e avere tipo di dati INT. Seconda colonna è Stock_name, che ha tipo di dati VARCHAR (20).

La query sarà: Vogliamo SELEZIONARE il tutti gli IDENTIFICATIVI delle azioni DALLA nostra TABELLA Stock CHE INIZINO con la lettera A (in maiuscolo ho praticamente evidenziato la query che andremo ad effettuare, ossia:

SELECT Stock_id

FROM Stock

WHERE Stock_name= A

)

Il codice PHP sarà molto semplice:

  • connessione al database
  • esecuzione della query SQL, con il WHERE  a seconda dei dati da POST / GET
  • output in formato JSON

Per esempio avremo questa funzionalità in city.php:

<?

/*ci colleghiamo al database(attenti perchè se lavorate in locale 
l'host è 10.0.2.2 e non 127.0.0.1)*/
php mysql_connect("host","username","password"); 
//selezioniamo il db a cui ci vogliamo connettere
mysql_select_db("TSA_Evolution");
//creamo al query
$sql=mysql_query("select Stock_id from Stock where STOCK_name like 'A%'"); 
/*Il metodo "mysql_fetch_assoc" restituisce un array in base alla query 
fatta e incrementa il dato*/
while($row=mysql_fetch_assoc($sql)) 
//inseriamo tutto nella variabile output
$output[]=$row;
/*stampiamo l'oggetto json, miraccomando a non stampare a video altri commenti, 
altrimenti quando andremo ad eseguire l'app android si bloccherà in quanto non 
riconoscerà i commenti come caratteri json*/
 print(json_encode($output)); 
//chiudiamo la connessione
mysql_close();

?>

Nella nostra applicazione Android dobbiamo:

  • usare un HttpPost per ottenere i dati,
  • convertire la risposta alla stringa JSON
  • analizzare i dati e usarli

Il codice per recuperare dati dal server per la nostra applicazione Android sarà:

package com.list; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList;

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import android.app.ListActivity; 
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast; 
public class AndroidPhp extends Activity { /*qualcuno qui ha esteso ad una 
ListActivity ma io preferisco gestirmi da me la risposta*/
JSONArray jArray;
String result = null; 
InputStream is = null; 
StringBuilder sb=null; 

@Override
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.android_php);
final TextView textviewDariRicevuti = (TextView) findViewById(R.id.datiRicevuti);
Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
buttonInviaDati.setOnClickListener(new View.OnClickListener() { 
@Override
public void onClick(View v) {
//invio richiesta
textviewDariRicevuti.setText(inviaDati());
}
});
}
public String inviaDati(){
String result="";
String stringaFinale="";
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//Sotto scrivo come si chiama il campo che invio(azione1) e il suo valore (1)
nameValuePairs.add(new BasicNameValuePair("Stock_name","azione1"));
/*queste due righe di codice che vedete qui sotto sono un piccolo trucchetto per ovviare
 (solo per il momento
 all'eccezione “NetworkOnMainThreadException", questa eccezione è importantissima in quanto
 ci dice che siccome stiamo effettuando una connessione nel thread principale avremo dei 
problemi in quanto tutto ciò che riguarda le connessioni o tutto ciò che comporta il 
superamento del limite di tempo massimo tra richiesta/risposta superiore a 5secondi la nostra 
applicazione Android la metterà in pausa appunto perchè stiamo programmando per uno smartphone
 e non possiamo attendere processi che impegnino per troppo tempo la nostra app. Ricordatevi
 una volta testato tutto, create nella classe i thread e gestite tutto dal thread.*/
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//http post 
try { 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://10.0.2.2/interroga.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
result = EntityUtils.toString(entity, HTTP.UTF_8);
}
catch(Exception e){ 
Log.e("log_tag", "Error in http connection"+e.toString());
} 
//convert response to string 
try{ 
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
sb = new StringBuilder();
sb.append(reader.readLine() + "\n"); 
String line=null; 
while ((line = reader.readLine()) != null) 
{ sb.append(line + "\n");
} 
is.close();
result=sb.toString(); 
}
catch(Exception e){ 
Log.e("log_tag", "Error converting result "+e.toString());
}
//paring data 

try{ 
jArray = new JSONArray(result); 
/*Quando vi dicevo di non inserire commenti nella pagina php era perchè l'app si
 bloccava proprio su questa
riga, in quanto "result" NON comprendeva caratteri json e il parsing non poteva 
essere effettuato */
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++){
Log.i("TEST","id: "+json_data.getInt("Stock_id")+
", name: "+json_data.getString("Stock_name")+
", cliente: "+json_data.getString("Stock_Client_id")+
", industria: "+json_data.getString("Stock_Industry_id")
);
stringaFinale = json_data.getInt("Stock_id")+ ""+ json_data.getString("Stock_name")+
""+ json_data.getString("Stock_Client_id")+
""+ json_data.getString("Stock_Industry_id")+"\n\n";
}
} catch(JSONException e1){ 
Toast.makeText(getBaseContext(), "Titolo Azionario non trovato" ,Toast.LENGTH_LONG).show();
} catch (ParseException e1) { e1.printStackTrace();
}
}
else { //is è null e non ho avuto risposta
}
return stringaFinale;
}
}

Non me ne vogliano i più esperti ma preferisco fornire una guida completa inserendo anche il Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonInviaDati"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Invia dati" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dati ricevuti:"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/datiRicevuti"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Per ora nessun dato ricevuto" />

</LinearLayout>

Non dimenticatevi di inserire il permesso alla connessione internet in AndroidManifest.xml:

<uses-permission android:name=”android.permission.INTERNET”></uses-permission>

Provateci e fatemi sapere come è andata, aspetto i vostri commenti..

😉 Good Luck

Alessio Scannicchio

 

 

45 commenti su “Android: Connessione a MySQL usando PHP

  1. ho una domanda…tutto bene ma io volevo fare una cosa un po’ diversa…praticamente volevo prendere quello che c’era all’interno della tabella mysql e poi copiarlo su un database mysql locale(ad esempio nella sdcard) però ho diversi campi all’interno della tabella e di tipo diverso…con json posso estrarre anche dati di tipo double?

  2. Ciao tafazzi87, scusa se ti rispondo in ritardo. Ciò che desideri fare tu puoi gestirlo tranquillamente prestando attenzione (trattandosi di double) ad avere la stessa la stessa struttura sulla sd quindi nel tuo caso (se non ho capito male) non ti serve avere double nella sd, quindi puoi prelevare il dato effettuare un “cast” (o un parse) e l’output metterlo nella sd così avrai direttamente la conversione “forzata” (perderai però la dobbia precisione).
    Se desideri puoi espormi il problema per intero così cerchiamo di risolverso.
    Forse così puoi vedere dove si presenta l’errore:

    switch (json_last_error()) {
    case JSON_ERROR_NONE:
    echo ' - No errors';
    break;
    case JSON_ERROR_DEPTH:
    echo ' - Maximum stack depth exceeded';
    break;
    case JSON_ERROR_STATE_MISMATCH:
    echo ' - Underflow or the modes mismatch';
    break;
    case JSON_ERROR_CTRL_CHAR:
    echo ' - Unexpected control character found';
    break;
    case JSON_ERROR_SYNTAX:
    echo ' - Syntax error, malformed JSON';
    break;
    case JSON_ERROR_UTF8:
    echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
    break;
    default:
    echo ' - Unknown error';
    break;
    }

    Ti auguro buona giornata
    A presto
    Alessio

      • HttpClient non è più supportato in sdk 23. Devi usare URLConnection or scendere a sdk 22 (compile ‘com.android.support:appcompat-v7:22.2.0’)

        Se hai bisogno del sdk 23, aggiungi questo al tuo gradle:

        android {
        useLibrary ‘org.apache.http.legacy’
        }

        Oppure prova con:
        (dentro il tuo grandle app)
        compile ‘com.loopj.android:android-async-http:1.4.9’

        (dentro la tua Activity)
        import com.loopj.android.http.AsyncHttpClient;
        import com.loopj.android.http.BaseJsonHttpResponseHandler;
        import com.loopj.android.http.RequestParams;
        import com.loopj.android.http.SyncHttpClient;

        Ricordati di sincronizzare
        Fammi sapere.
        😉

      • grazie mille, io ho scritto questo codice. E’ giusto ?
        package com.lore.message.eventflux.androidphp;

        import android.app.Activity;

        import java.io.BufferedInputStream;
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.net.MalformedURLException;
        import java.net.URL;
        import java.net.URLConnection;
        import java.util.ArrayList;
        import org.json.JSONArray;
        import org.json.JSONException;
        import org.json.JSONObject;import android.app.ListActivity;
        import android.net.ParseException;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import java.lang.Object;
        import android.os.StrictMode;
        import android.util.Log;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;
        import android.widget.Toast;
        public class AndroidPhp
        {
        public void getTrial() {
        new Async().execute();
        }

        public class Async extends AsyncTask {

        @Override
        protected String doInBackground(String… params) {
        Log.i(null, “entered”);
        // TODO Auto-generated method stub
        URL url;
        BufferedReader reader = null;
        String s = “”;
        try {
        url = new URL(“http://localhost/city.php”);
        URLConnection con = url.openConnection();
        reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line = reader.readLine().toString();
        while ((line = reader.readLine()) != null) {
        s = s + line;
        }
        } catch (MalformedURLException e) {
        e.printStackTrace();
        } catch (IOException e) {
        e.printStackTrace();
        } catch (Exception e) {
        e.printStackTrace();
        } finally {
        if (reader != null) {
        try {
        reader.close();
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
        }
        Log.i(null, “response: ” + s);
        return s;
        }

        }

        }

  3. Ciao! intanto complimenti per l’articolo, molto interessante!
    Io sono da poco nel mondo di android…

    ho provato ad eseguire il codice e mi da i seguenti errori, da cosa dipendono e come posso risolvere?
    Grazie!

    Error:A problem was found with the configuration of task ‘:app:generateDebugBuildConfig’.
    > No value has been specified for property ‘buildConfigPackageName’.
    Error:È previsto un apice di apertura per l’attributo “{1}” associato a un tipo di elemento “android:name”.

  4. Ciao Marco, ti ringrazio per aver letto il mio articolo è sempre un piacere sapere che nel mio piccolo posso aiutare qualcuno.
    Allora…andiamo per gradi…dimmi utilizzi Grandle per caso?
    Il problema che tu attualmente hai dipende dalla configurazione, ma stai provando ad esportare il progetto?

    • Io uso eclipse, son riuscito a risolvere il primo problema, che era in effetti di configurazione. ora ricompilando mi da sempre

      [2014-07-17 12:04:41 – com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper] Parser exception for C:\sorgenti\AndroidPhp\AndroidManifest.xml: È previsto un apice di apertura per l’attributo “{1}” associato a un tipo di elemento “android:name”.

      Nel file AndroidPhp.java mi da:
      Multiple markers at this line
      – android_php cannot be resolved or is not a field
      – Line breakpoint:AndroidPhp [line: 45] –
      (ho creato il file xml “android_php” come da te indicato ed è posizionato nella cartella res/layout)

      All’interno di android_php.xml ho 3 worning:
      [I18N] Hardcoded string “Invia dati”, should use @string resource
      e, lo stesso per le altre due stringhe “Dati ricevuti” e “Per ora nessun..”

      Ti ringrazio per l’attenzione!

  5. apparte gli errori nel file android_php.xml ho risolto il resto.
    Ora mi ritrovo con n errore nel file Android_php.java nell’else mi dice:Syntax error on token “else”, { expected
    In effetti non riesco a capire come funzioni quest’else dato che non c’è un if O.o

    Grazie ancora!

  6. Ciao Alessio,

    ottimo articolo!

    Ho un problema però:
    quando vado a creare il file .apk mi da 3 errori.

    – Error:(114, 5) error: illegal start of type
    – Error:(114, 9) error: ‘;’ expected
    – Error:(116, 5) error: class, interface, or enum expected

    Se vado alla riga dell’errore mi trovo nel file java, l’errore risulta essere nelle ultime righe dove c’è ‘return stringaFinale’.

    Come posso risolvere??

    Grazie

  7. Ciao, sto provando a fare un’applicazione android ma non funziona la connessione al database, da questo errore:
    IsDataSchedulerEnabled (): false
    Sapresti dirmi cosa non va ?

    • Ciao Ilaria, hai provato ad avere la WiFi attiva? Perché dall’errore riporta che il metodo della pianificazione dei dati è disattivato…. Cosa fà l’applicazione? hai provato a vedere se hai consentito l’accesso a internet all’applicazione? postami il tuo LogCat…

  8. Ciao,
    ho provato ad implementare il codice ,
    riuscendo a sistemare tutti gli errorini di codice alla fine lanciando il programma mi esce fuori questo errore :
    Error in http connectionjava.lang.IllegalStateException: Content has been consumed

    Il file Php l’ho già verificato ed è funzionante , la app viene bloccata nel codice try catch che restituisce il messaggio “Titolo Azionario non trovato”

  9. l’errore sembrerebbe essere sulla linea :
    result = EntityUtils.toString(entity, HTTP.UTF_8);
    poichè il pare che non possa richiamare il contenuto dell’entity due volte

  10. Ciao alexiscanny,
    stavo provando il tuo codice.
    Sembrerebbe andare tutto, ma nel momento in cui vado a fare il json_data.getString(“Nome”) mi va in crash l’applicazione e mi si chiude.
    riusciresti ad aiutarmi?

    PS: ho usato tutto il tuo codice… ho cambiato solo i campi della tabella mettendo una che ho su un mio sito.

    grazie per la disponibilità!

      • Ciao Alex! Nel tuo codice vedo che hai inseirot il bottone con ID “buttonInviaDati” a cui poi aggiungi un metodo OnClickListener. Immagino che vuoi far cominciare la trasmisisone al click da parte dell’utente di tale bottone, corretto?
        E se invece si volesse mostrare il dato importato da MySQL all’apertura dell’activity?

  11. Marco secondo devi inviare cmq la richiesta (oppure la fai inviare direttamente in automatico quando apri l’ctivity) e successivamente catturare la risposta (dipende se ti arriva un json allora lo converti in stringa) e successivamente lo visualizzi nel TextView…
    Sono riuscito ad intendere bene la tua richiesta?

  12. si puoi inserire nella onCreate, quindi gli spari direttamente il metodo inviaDati() il quale return una String e la stringa gliela spari al textView, ma ti consiglio di fare un’altra cosa, creati un thread (non sò per quale motivo qui non l’ho creato) creati un AsyncTask così se qualcosa và storto tra invio o ricezione puoi gestirti il thread e la Exception 😉 spero di averti risposto in maniera esaustiva 😉

    • Eccellente!
      Quindi nel tuo caso

      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.android_php);
      final TextView textviewDariRicevuti = (TextView) findViewById(R.id.datiRicevuti);
      textviewDariRicevuti.setText(inviaDati());
      });
      }
      public String inviaDati(){
      String result=””;
      String stringaFinale=””;

      (…) e tutto il resto, se non sbaglio. In pratica devo rimuovere l’Override con la menzione onClick, corretto?

    • a cui segue il resto del codice, no?

      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.android_php);
      final TextView textviewDariRicevuti = null;
      textviewDariRicevuti.setText(inviaDati());
      });
      }
      public String inviaDati(){
      String result=””;
      String stringaFinale=””;

      A che pro dichiarare null un TextView non identificato in un layout?

      • Marco scusami sono busy a lavoro, in effetti quando te l’ho scritto non ho fatto molto caso alla dichiarazione insensata fatta di TextView…
        Comunque hai fatto il test? Come è andata? Curioso di sapere come hai risolto magari può essere d’aiuto a qualcun’altro che inciampa in questo thread per caso… 😉

  13. Ciao Alex, purtroppo mi va male. Eliminando queste stringhe

    Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
    buttonInviaDati.setOnClickListener(new View.OnClickListener() {

    mi va all’aria

    textviewDariRicevuti.setText(inviaDati());

    Poi, scusa l’ignoranza, ma le classi HttpClient, DefaultHttpClient, HttpPost, UrlEncodedFormEntity, HttpResponse eccetera come le integro?

  14. Caro Alex è giusto questo codice ?

    package com.lore.message.eventflux.androidphp;

    import android.app.Activity;

    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;import android.app.ListActivity;
    import android.net.ParseException;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import java.lang.Object;
    import android.os.StrictMode;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    public class AndroidPhp
    {
    public void getTrial() {
    new Async().execute();
    }

    public class Async extends AsyncTask {

    @Override
    protected String doInBackground(String… params) {
    Log.i(null, “entered”);
    // TODO Auto-generated method stub
    URL url;
    BufferedReader reader = null;
    String s = “”;
    try {
    url = new URL(“http://localhost/city.php”);
    URLConnection con = url.openConnection();
    reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String line = reader.readLine().toString();
    while ((line = reader.readLine()) != null) {
    s = s + line;
    }
    } catch (MalformedURLException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (reader != null) {
    try {
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    Log.i(null, “response: ” + s);
    return s;
    }

    }

    }

  15. Buonasera,

    sono all’inizio nella programmazione Android, ho copiato il codice postato, ma ho un sacco di errori

    Error:(2, 1) error: class, interface, or enum expected
    Error:(119, 5) error: illegal start of type
    Error:(119, 9) error: ‘;’ expected
    Error:(121, 5) error: class, interface, or enum expected
    Error:(122, 1) error: class, interface, or enum expected

    non capisco cosa devo fare per eliminarli, eppure se ho copiato il codice dovrebbe funzionare

    • Buonasera mi dispiace ma non è del tutto vero cioè che lei ha scritto, copiare e incollare non è roba da sviluppatori bensì è più da chi non ha valutato attentamente il codice.
      Condividere il proprio codice significa condividere il proprio operato per beneficiare l’utente che intende prendere SPUNTO da quel codice per SVILUPPARE un PROPRIO codice sorgente.
      Provi a pensare con la propria testa e il proprio cervello invece di copiare e incollare e scriva righe di codice proprietarie che si possano interfacciare al mio codice sorgente che è stato all’epoca scritto per risolvere la connessione con il mio database e creato ad hoc per le interfacce che io ho usato.
      Faccia pratica con gli errori perché un bravo sviluppatore è colui che risolve gli errori e non colui che copia e chiede ad altri di risolvere gli errori!

      Alla riga 119 deve inserire il “;”
      Legga e presti attenzione a che tipo di errori le vengono mostrati.

      Mi contatti per qualsiasi altro chiarimento

      A presto

      Alessio

  16. Buongiorno Alex,
    Ti scrivo per chiederti aiuto riguardo questo pezzetto di codice.
    try {
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    result = EntityUtils.toString(entity, HTTP.UTF_8);
    } catch (Exception e) {
    Log.e(“log_tag”, “Error in http connection” + e.toString());
    }

    Quando clicco sul bottone mi appare questo errore nel logcat:
    Error in http connectionjava.lang.IllegalStateException: Content has been consumed

  17. Buongiorno Alex,
    Ti scrivo per chiederti aiuto riguardo questo pezzetto di codice.
    try {
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    result = EntityUtils.toString(entity, HTTP.UTF_8);
    } catch (Exception e) {
    Log.e(“log_tag”, “Error in http connection” + e.toString());
    }

    Quando clicco sul bottone mi appare questo errore nel logcat:
    Error in http connectionjava.lang.IllegalStateException: Content has been consumed

    • Ciao Luca e grazie per avermi scritto…
      Il problema può essere causato perchè Http stuff è abbastanza vecchio e non usato più, deprecated…inoltre entity è usato 2 volte, motivo per il quale ti dice che la risorsa è già stata impegnata da qualcunaltro, prova a vedere se puoi risolvere passando “is”.
      Scusami se la risposta è veloce ma stando a lavoro non posso scrivere molto…
      Fammi sapere e stasera vedo se ti posso aiutare di più.
      Grazie ancora e buon debug 😉
      Usa Volley o Retrofit 2.xxx

      • Grazie per la risposta, ho provato a passare is ma mi da lo stesso problema, non saprei da dove iniziare utilizzando Volley o Retrofit 2.xxx perchè è da una settimana che utilizzo android studio.

  18. Buongiorno Alex,
    bellissimo articolo ti chiedo aiuto per un errore che ho sulla compilazione

    Error:Execution failed for task ‘:app:transformClassesWithInstantRunForDebug’.
    > org/apache/http/pool/ConnPoolControl

    come posso risolvere

    • Ciao Ciccio e ti ringrazio per avermi scritto..quell’errore può essere causato dall’ultimo aggiornamento fatto in quanto vedo chw richiama lo instant run che sarebbe meglio disattivarlo. Ecco come:
      Apri Settings: per Windows o Linux, seleziona File > Settings dal menu. Per Mac OSX, seleziona Android Studio > Preferenze dal menu bar.
      Pou Build, Execution, Deployment > Instant Run.
      Deseleziona il box.
      Rilancia Run e prova
      Attendo tue nuove
      Alessio

Lascia un commento