Erzwinge das Blockieren des Lesevorgangs AsyncTask

9

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()

zu überprüfen %Vor%

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?

    
Dia 09.09.2015, 10:48
quelle

1 Antwort

0

java.io.InputStream implementiert blockierende E / A. Es wird erwartet, dass Ihre Anwendung auf

blockiert wird %Vor%

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

erstellt wurde, schließen können %Vor%

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.

    
Aleh Maksimovich 18.10.2017 18:14
quelle