J'ai un fil dans lequel le Si j'appelle Comment puis-je débloquer le Apparemment, le jre régulier jettera un Toute astuce sur une solution pour l'environnement Android serait grandement appréciée. P> lue () code> méthode d'un
INPUTStream code> est appelé dans une boucle. Lorsqu'il n'y a plus d'octets à lire, le flux bloquera jusqu'à ce que de nouvelles données arrivent. P>
fermeture () code> sur le code> INPUTStream code> à partir d'un autre fil, le flux est fermé, mais le
bloqué () code> appel reste toujours bloqué. Je supposerais que la méthode
lue () code> doit maintenant revenir avec une valeur de
-1 code> pour indiquer la fin du flux, mais ce n'est pas le cas. Au lieu de cela, il reste bloqué pendant plusieurs minutes jusqu'à ce qu'un délai de TCP se produise. P>
ferme () code> appel? p>
SocketException code> immédiatement lorsque le flux ou la prise Le blocage
Lecture () code> L'appel correspond à IS
Fermer () Code > 'd. Le temps d'exécution Android Java que j'utilise, cependant, ne sera pas. P>
6 Réponses :
Vous pouvez utiliser Il existe un exemple de programme que vous pouvez regarder ici . Méthode: package java.nio code>. Nio signifie IO non bloquante. Ici, les appels (pour dire que lire et écrire) ne sont pas bloqués. De cette façon, vous pouvez fermer le flux. P>
ProcurentRead Code> P>
seul appel faire quelque chose comme ça: p> Définir le fichier lecture () code> quand il y a des données disponibles.
code> pour arrêter la lecture. p> p>
Disponible () ne vous indiquera que si des données sont disponibles sans effectuer un appel système. Cela peut renvoyer 0 quand il y a des données à lire.
D'accord. C'est exactement ce que j'avais auparavant. Il utilise beaucoup de CPU, cependant, comme la boucle tourne constamment. Je pensais que l'utilisation d'un bloc d'E / S serait remédier à ce problème.
Vous pouvez ajouter un veille code> comme dernière ligne de votre boucle. Cela vous empêchera de vous occuper d'attendre
Cette solution n'est pas la plus élégante, mais la seule que je dois travailler correctement sur Android.
Notez que les documents Android pour la disponibilité () commencent par l'avertissement "Notez que cette méthode offre une garantie si faible qu'il n'est pas très utile dans la pratique."
Lorsque l'autre extrémité ferme la connexion, votre flux retournera -1 sur une lecture (). Si vous ne pouvez pas déclencher l'autre extrémité pour fermer la connexion E.G. En fermant votre flux de sortie, vous pouvez fermer la prise qui provoquera une impression IoException dans le thread de lecture () de blocage ().
Pouvez-vous fournir un court exemple qui reproduit votre problème? P>
104 105 10 java.net.SocketException: Socket closed
C'est ce que je pensais. Mais je ne reçois pas d'exception. La lecture () continue de bloquer même si la prise est fermée.
Merci pour l'exemple de code Nice! L'échantillon fonctionne bien lors de la compilation comme une application Java régulière. L'appui à une application Android Bones Bones révèle que l'exception n'est apparemment pas lancée, même si les mêmes classes Java.net sont utilisées. Donc, le problème réside dans Android, je suppose. Une idée?
J'ai pris la liberté d'ajouter Android en tant que balise car cela semble être un détail clé. ;)
voir Java Concurrence dans la pratique pour un très bon système à Annuler un fil lorsque vous travaillez avec des sockets. Il utilise un exécutant spécial ( CanchingElexEcutor code>) et un appel téléphonique spécial (
SockingTask code>). P>
Nous avions le même problème: aucune exception lors de la commutation réseau (par exemple, passer de 3G en wifi lors du téléchargement).
Nous utilisons le code de http://www.androidsnippets.com/download-an-http-file-a-sdcard-with-progresse- Notification , qui fonctionne parfaitement sauf dans certains cas lorsque la connexion réseau a été perdue. p>
La solution spécifiait une valeur de délai d'attente, ceci est défini en standard sur 0 (Signification: attendre infiniment). < / p> expérience avec une valeur de délai d'expiration appropriée pour vous. p> p>
J'ai eu un tel problème sur Samsung 2.3. Lors de la passation des blocs de méthode () de la méthode (). J'ai essayé tous les conseils de ce sujet. Rien n'a aidé. De mon éventuel éventuel, c'est un problème spécifique au dispositif, car devrait strong> lancer ioException en raison de Voici l'exemple de code: p> downloadthread.java p> private volatile boolean canceled;
private volatile InputStream in;
private boolean downloadFile(final File file, final URL url, long totalSize) {
OutputStream out = null;
try {
Log.v(Common.TAG, "DownloadThread: downloading to " + file);
in = (InputStream) url.getContent();
out = new FileOutputStream(file);
return copy(out, totalSize);
} catch (Exception e) {
Log.e(Common.TAG, "DownloadThread: Exception while downloading. Returning false ", e);
return false;
} finally {
closeStream(in);
closeStream(out);
}
}
public void cancelDownloading() {
Log.e(Common.TAG, "DownloadThread: cancelDownloading ");
canceled = true;
closeStream(in); //on my device this is the only way to unblock thread
}
private boolean copy(final OutputStream out, long totalSize) throws IOException {
final int BUFFER_LENGTH = 1024;
final byte[] buffer = new byte[BUFFER_LENGTH];
long totalRead = 0;
int progress = 0;
int read;
while (!canceled && (read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
totalRead += read;
}
return !canceled;
}
Je ne suis pas un gars Java, mais si vous contrôlez l'application / thread en envoyant le flux, ne pourriez-vous pas envoyer d'octet / couple d'octets de fin de message que le lecteur peut utiliser pour déterminer que le flux doit être fermé ?