2016-09-28 2 views
1

J'utilise un FileInputStream dans un thread dans Android Java pour lire à partir d'un fichier d'interface série. stream.read (buffer) bloque s'il n'y a pas de données en attente maintenant, si de nouvelles données arrivent à nouveau est continue. Les données arrivent de temps en temps, chaque fois que quelque chose arrive dans le fil continue de fonctionner. C'est parfait!Android fermer FileInputStream

Mais quand je veux terminer le fil, il semble que je tombe sur un bug connu de longue date. thread.interrupt() n'annule pas stream.read().
Il y a beaucoup de questions à ce sujet. La seule chose qui devrait fonctionner est de fermer le flux sous-jacent. Mais si je ferme mon FileInputStream stream.read() dans mon thread de réception continue à attendre. Il ne s'arrête qu'après avoir reçu le prochain paquet de données - cela va bien sûr mal. Que puis-je faire d'autre pour vraiment fermer ou éteindre le FileInputStream?

Après avoir discuté de ma solution ressemble à ceci:Ce n'est pas la meilleure performance et utilise des available() qui n'est pas conseillé dans les docs mais ça marche.

Le fil qui écoute le fichier:

byte[] buffer = new byte[1024]; 
while (!isInterrupted()) 
{ 
    if (stream.available() == 0) 
    { 
    Thread.sleep(200); 
    continue; 
    } 

    // now read only executes if there is something to read, it will not block indefinitely. 
    // let's hope available() always returns > 0 if there is something to read. 
    int size = stream.read(buffer); 

    now do whatever you want with buffer, then repeat the while loop 
} 

La durée de sommeil est un compromis entre la boucle pas tout le temps et l'obtention de données dans un intervalle acceptable. Le Mainthread termine ce avec

stream.close(); // which has no effect to the thread but is clean 
thread.interrupt(); 
+0

peut vous envoyer ce bloc de code? – user1506104

+0

Le fil est 'while (! IsInterrupted()) { int size = inputStream.read (buffer); . . . tampon de processus } ' Le fil principal est: inputStream.close(); – Droidum

+0

'read' a une exception d'E/S. capturez-vous ceci? fournir plus d'informations en montrant plus de votre code source. – user1506104

Répondre

1

Je suppose qu'il n'y a rien que vous pouvez faire avec cette opération read de blocage. Essayez le available pour vérifier s'il existe des données disponibles avant de les lire.

while(!isInterrupted()) { 
    int len = 0; 
    if(len = inputStream.available() > 0) 
    // read your data 
} 

Voici une autre option: How to stop a thread waiting in a blocking read operation in Java?

+1

Ok merci de confirmer ma peur, au moins je peux arrêter de chercher :-) Je vérifie pour disponible() dans une boucle avec le sommeil. disponible() est documenté pour être fiable et occupé-attente n'est pas agréable aussi. Mais apparemment, il n'y a pas d'autre moyen. – Droidum

+0

une fois que vous avez trouvé la meilleure solution, s'il vous plaît le poster ici. Je suis intéressé de connaître la solution. ty. – user1506104

+0

moi aussi, voir l'article original – Droidum