timber studio programacion para móviles libro edición desarrollo curso aplicaciones java android android-asynctask http-get bufferedinputstream

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?