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 JavaScript, Standard 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
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?
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
alex, io ho problemi con import org.apache.http
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;
}
}
}
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”.
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!
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!
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
Eppure il “;” l’ho inserito…prova a postarmi il codice che hai cambiato…non è che hai rimosso qualche parentesi graffa?
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…
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”
Ciao Max, al momento sono a lavoro…appena posso controllo l’errore e ti scrivo.
Grazie per aver letto il mio articolo…ti scrivo quanto prima.
Alessio
Grazie mille Alex!
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
Dopo un mese penso tu abbia risolto il problema…come è andata?
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, puoi provare a mandarmi il LogCat. Per il crash può dipendere o dalla versione, quindi incompatibilità oppure da un accesso fuori dai limiti oppure ancora dall’internet connection…
Ciao Dado probabilmente crasha perchè dentro il Manifest non hai inserito l’activity, prova a fare il debug invece di run e mandami gli screenshot prima del crash…
Ciao, come cambieresti il codice se anziche’ un bottone da cliccare volessi avere il dato inserito nel TextView all’apertura dell’activity?
Ciao Marco, spiegati meglio perché onestamente non ricordo dove spingevo il pulsante…dimmi tutto cosi vedo se posso aiutarti 😉 e grazie per il commento ;))
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?
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?
Esatto Alex! Come la si può aprire in automatico? OnCreate ci sta?
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?
Prova così:
final TextView textviewDariRicevuti =null;
textviewDariRicevuti.setText(inviaDati());
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… 😉
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?
Marco mi dispiace risponderti tardi….per le classi Http o usi Loopj oppure aggiungi i Moduli httpclient-4.5
Vai in settings.grandle
aggiungi:
include ‘:app’, ‘:httpclient-4.5’
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;
}
}
}
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
ha ragione a scrivere questo, ma è la prima volta che entro in android studio e non ci sto capendo molto
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
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.
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 Raffaele,
A prima Vista sembra che tu abbia la connessione dati disattivata.
Postami il logcat
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