PDA

Ver la Versión Completa : [ CONSULTA ] Cuando acaba de recibir datos un inputStream


josuto59
16/12/15, 00:26:17
Buenas noches.
Pues ahora estoy atascado en como conseguir saber que el imputstream ha terminado de recibir datos del bluetooth para mientras tanto detener la ejecucion del programa y que continue cuando termine la recepcion de datos.
el codigo que tengo es este:


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

@Override
protected Void doInBackground(InputStream... inps) {
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"));
}
} catch (Exception e) {
// To be done
}
}
}

protected void onProgressUpdate(String... values) {
String input = values[0];
appendText(input);
}
}
Despues intentarlo de varias formas no logro detectar cuando acaba la recepcion de datos y poder guardarlos en un fichero

Alguna pista?

ah! se me olvidaba, si depurando detengo la ejecucion, dejo que terminen de cargar los datos y despues ejecuto la rutina de guardalos en el fichero, me los guarda perfectamente

muchas gracias. Un saludo

kriogeN
16/12/15, 00:46:45
Bienvenido al fantástico mundo de los Heisenbug xDDD

Aunque en este caso es bastante común y no se considera como tal, ya que si no cierras de forma correcta un OutputStream (no pones que hace appendText pero imagino que será almacenar en un OutputStream) te puede pasar que los datos no se guarden.

En cuanto a la pregunta en sí, un InputStream no tiene más datos cuando los bytes leídos son 0.

Lo que tienes que asegurarte es que en algún momento le hagas close al OutputStream, porque si no lo haces puedes perder writes, ya que se escriben de forma asíncrona. Si no puedes saber cuando vas a cerrar el fichero lo que tienes que hacer por lo menos es hacer un flush después de una serie de writes, para asegurarte que esos writes se escriben de forma inmediata.

josuto59
16/12/15, 01:40:07
hola kriogen, el codigo del appendText es:


public void appendText(String data) {
switch (mensaje) {
case "Conexion establecida":

txtHoraSis.setText(txtHoraSis.getText().toString() + data);
txtHoraSis.setTextColor(0xFFFC0808);

txtHoraTlf.setText(tomaHora());
txtHoraTlf.setTextColor(0xFFFC0808);

txtEstado.setText("Conectado");
txtEstado.setTextColor(0xFFFC0808);

break;
case "lista":
bufer = bufer.concat(data);

break;
case "hora":
txtHoraTlf.setText(tomaHora());
txtHoraSis.setText(txtHoraSis.getText().toString() + data);
txtHoraSis.setTextColor(0xFFFC0808);

break;
default:
break;
}
}

El problema lo tengo en el case "lista" tengo que detener el programa hasta que se termine de llenar la variable bufer.
Y no acierto a pararlo.
como se podria hacer.