Ich habe eine AsyncTask in meiner Anwendung:
%Vor% Und ich möchte AsyncTask task
beenden, wenn ich meine Anwendung schließe: (back putton).
Ich habe die Antwort hier versucht Android - Abbrechen AsyncTask Forcefully , um isCancelled()
Aber es scheint, dass die Anwendung bei myInputstream.read(readbyte)
blockiert, wenn task.cancle(true)
aufgerufen wird.
Android wird ein "App reagiert nicht mehr ..." Pop-up für mich werfen.
Wie kann ich das Blockieren des Lesevorgangs erzwingen?
java.io.InputStream
implementiert blockierende E / A. Es wird erwartet, dass Ihre Anwendung auf
bis die Operation read
-1
zurückgibt, was bedeutet, dass keine Daten mehr aus dem Stream gelesen werden (wie es geschlossen wurde oder die Verbindung beendet wurde) oder die Ausnahme ausgelöst wird.
Die einzige Möglichkeit, den Thread, der auf Daten im Stream wartet, zu entsperren, besteht darin, ihn zu schließen. In Ihrem Fall müssen Sie das Socket
, das in
Linie.
%Vor% sollte Ihr Lesen unterbrechen. Aber seien Sie sich bewusst, dass Socket.close()
tatsächlich vorhanden ist
Schließt diesen Socket.
Jeder Thread, der bei diesem Socket in einer E / A-Operation blockiert wird, löst eine SocketException aus.
Damit wird der Task-Laufsteg entsperrt, aber Sie müssen den SocketException
korrekt in Ihrer Task behandeln, um alle Operationen zu beenden ( vielleicht fehlt Ihnen das ).
FYI das
aufrufen %Vor% macht nicht viel Sinn, da dies nur den cancelled
-Flag für die Aufgabe festlegt. Es liegt in der Verantwortung Ihres Codes, nach der Flagge zu suchen, und wenn Sie E / A blockieren, haben Sie keine Möglichkeit, dies zu tun.
Alternativ sollten Sie nicht blockierende E / A in Betracht ziehen.
Tags und Links java android sockets android-asynctask