PDA

Ver la Versión Completa : [ SOLUCIONADO ] porque la clase ReadInputTask no invoca al metodo onPostExecute


josuto59
19/12/15, 20:03:20
Hola compañeros, que estoy haciendo mal para que la clase ReadInputTask no invoque nunca al metodo onPostExecute, segun android developers debe hacerlo despues de doInBavkground. Os pongo el codigo:


private class ReadInputTask extends AsyncTask<InputStream, String, String> {

@Override
protected String doInBackground(InputStream... inps) {
//String p;
InputStream inputStream = inps[0];
byte[] buffer = new byte[256]; // buffer store for the stream
int bytes; // bytes returned from read()
while (true) {
try {
// Read from the InputStream
bytes = inputStream.read(buffer);
if (bytes > 0) {// Get number of bytes and message in "buffer"
publishProgress(new String(buffer, 0, bytes, "UTF-8"));
// p.concat(byte[]):
}
} catch (Exception e) {
// To be done
}
}
}

protected void onProgressUpdate(String... values) {
String input = values[0];
appendText(input);
}

//@Override
protected void onPostExecute(String... result) {
loQueSea();
}
}Venga, a ver si podeis hecharme una mano y voy acabando el proyecto.
Muchas gracias

kriogeN
19/12/15, 20:05:54
Porque el doInBackground tiene un while(true) más grande que una casa.

josuto59
19/12/15, 20:45:15
Pense que al igual que invoca a onProgressUpdate llamaria tambien a onPostExecute... (este android me mata).
kriogen, me puedes encauzar un poco en como se podria hacer para que sea llamado el metodo onPostExecute.
Muchas gracias.

kriogeN
19/12/15, 22:11:38
No es Android, es Java, o mejor dicho es programación en general.

El onPostExecute sólo se inicia cuando el doInBackground termina (como su propio nombre indica). Si tienes un while(true) que no se rompe nunca el doInBackground ese bucle se ejecuta sin cesar, y por tanto el doInBackground no termina y el onPostExecute no se ejecuta.

En vez de usar while(true) tendrás que usar una variable que indique si se ha producido lectura o no, o directamente subir la lectura al while y poner ahí la condición.

Braaank
22/12/15, 08:59:25
Como dicen los compañeros, el método onPostExecute solo se ejecuta cuando termina el doInBackground, si no termina el doInBackground ya sea porque ha lanzado una excepción o tienes un bucle infinito nunca va a ejecutar el onPostExecute, en otras palabras el onPostExecute no ejecutará hasta que el doInBackground ejecute la sentencia "return"


Enviado desde mi iPad utilizando Tapatalk

josuto59
28/12/15, 00:31:43
Bueno, al final lo he solucionado mandando desde arduino un caracter determinado al final del mensaje para que al detectarlo, saber que ha terminado el mensaje y poder seguir ejecutando la app.
No es la forma mas ortodoxa ni la mas elegante, pero mientras me voy empapando de android tirara con esto.
muchas gracias por la ayuda, los comentarios y las criticas (que de todo se aprende).
Por mi el tema queda cerrado.

kriogeN
28/12/15, 10:36:13
Bueno, al final lo he solucionado mandando desde arduino un caracter determinado al final del mensaje para que al detectarlo, saber que ha terminado el mensaje y poder seguir ejecutando la app.
No es la forma mas ortodoxa ni la mas elegante, pero mientras me voy empapando de android tirara con esto.
muchas gracias por la ayuda, los comentarios y las criticas (que de todo se aprende).
Por mi el tema queda cerrado.

De hecho es la forma correcta si el tamaño del mensaje es variable, salvo que indiques al principio el número de bytes que se van a enviar.