java - studio - programacion android pdf 2018
¿Cómo accedo al valor devuelto desde un método API web en Android? (1)
Después de estar confundido acerca de cómo hacerlo (como se puede ver aquí y aquí , ahora me estoy conectando con éxito a mi aplicación de servidor y el método RESTful apropiado con este código:
public void onFetchBtnClicked(View v){
if(v.getId() == R.id.FetchBtn){
Toast.makeText(getApplicationContext(), "You mashed the button, dude.", Toast.LENGTH_SHORT).show();
new CallAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242");
}
}
public static class CallAPI extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
String urlString=params[0]; // URL to call
String resultToDisplay = "";
InputStream in = null;
// HTTP Get
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
in = new BufferedInputStream(urlConnection.getInputStream());
} catch (Exception e ) {
System.out.println(e.getMessage());
return e.getMessage();
}
return resultToDisplay;
}
protected void onPostExecute(String result) {
Log.i("FromOnPostExecute", result);
}
} // end CallAPI
Me doy cuenta de que necesito asignar algo (que no sea una cadena vacía en la inicialización) a resultToDisplay, pero ¿qué? ¿Qué parte de "en" necesito acceder / encubrir a una cadena?
ACTUALIZAR
La forma "manual" funciona para mí, pero la fancypants apache io utiliza "no tanto" (bueno, compila ...). Este es mi código:
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
in = new BufferedInputStream(urlConnection.getInputStream());
resultToDisplay = getStringFromInputStream(in);
total = IOUtils.toString(in);
La asignación de resultToDisplay funciona (obtengo, "18"). la asignación total no (tengo, "").
Nota : El método "getStringFromInputStream ()" es del enlace de Raghunandan.
ACTUALIZACIÓN 2
Esto funciona simplemente de maravilla (usando la idea de WIllJBD para usar el IOUtils de Apache commons):
new CallWebAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242");
. . .
private class CallWebAPI extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
String urlString=params[0]; // URL to call
String result = "";
// HTTP Get
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection =
(HttpURLConnection)url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
if (null != inputStream)
result= IOUtils.toString(inputStream);
} catch (Exception e ) {
System.out.println(e.getMessage());
return e.getMessage();
}
return result;
}
@Override
protected void onPostExecute(String result) {
Log.i("RenameTheWashingtonFootballTeamTheRedskinPeanuts", result);
}
}
... y así aparentemente no es necesario agregar algo como "compilar archivos (''libs / commons-io-2.4.jar'')" a la sección de dependencias de build.gradle, como aparentemente al menos era necesario a la vez, de acuerdo a esto Si alguien puede verificar tales endosos [m, pp] para build.gradle ya no son necesarios, sería gradleful.
ACTUALIZACIÓN 4
Me di cuenta de que eliminé inadvertidamente el "@Override" del método onPostExecute (), pero no importó; funcionó bien sin él, y funciona bien una vez que lo restauré. Entonces, ¿cuál es la ventaja de [no] tenerlo? ¿Es solo una pelusa superflua?
¿Por qué no usar algo como IOUtils?
InputStream inputStream = urlConnection.getInputStream();
if (inputStream != null)
String content = IOUtils.toString(inputStream);
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html
ahora puede analizar la cadena en Json o XML, usando una de muchas bibliotecas.