10

Ich möchte zwingen, AsyncTask abzubrechen. Ich sehe, dass Sie isCancelled() wie in this valid solution (was unter der Haube AtomicBoolean verwendet verwenden könnenUm das Abbrechen von AsyncTask zu erzwingen, sollte das Flag in DoInBackground nicht periodisch flüchtig sein?

Aber ich sehe Lösungen wie suspiciousSolution1, suspiciousSolution2, suspiciousSolution3, wo es neue Flagge private boolean isTaskCancelled = false; eingeführt ist

Und ich begann fragen -.. Da das flag wird in

modifizierten
public void cancelTask(){ 
    isTaskCancelled = true; 
} 

, die auf einigen Faden läuft, und wird in

gelesen

, die in WorkerThread läuft, dann sollte das Flag isTaskCancelled flüchtig sein (oder AtomicBoolean wie in der Google-Implementierung).

+0

ja, ist es wahrscheinlich – thepoosh

+0

Gemäß Google-Richtlinien volatil sein sollte, AsyncTask sollte dafür sehr kleine Funktion verwendet werden. Es sollte keine größeren Schleifen oder schwerere Aufgaben ausführen. Verwenden Sie für solche Features entweder Handler und Runnable oder Hintergrunddienst. Die Flagge ist vorhanden, wird aber nur zu Beginn Ihrer if-Bedingung validiert. Die Aufgabe kann oder kann nicht sofort wie gewünscht abgebrochen werden. – chejaras

+0

Danke, aber Sie kommentieren die Frage nicht beantwortet. –

Antwort

5

Ja, sollte es volatile sein. Andernfalls ist ein Schreiben in die Variable in Thread A für einen eingelesenen Thread B aufgrund der Optimierung (durch Compiler, JVM usw.) möglicherweise nicht sichtbar. Siehe this

+0

Ja. 'doInBackground' wird auf einem von mehreren Threads in einem Thread-Pool ausgeführt, der einen Executor unterstützt. Es ist unwahrscheinlich, dass 'cancelTask' vom selben Thread ausgeführt wird. Das bedeutet, dass 'isTaskCancelled' von mehreren Threads aus aufgerufen wird und" flüchtig "sein muss. Das 'AsyncTask'-Framework verwendet selbst ein' AtomicBoolean' –

0

Ja, flüchtig. Beachten Sie, dass Sie dies nur verwenden, um Ihre asynctask regelmäßig zu überprüfen. Wenn es mehrere Threads wären, würde ich vorschlagen, atomare Felder zu verwenden. Pls finden Sie hier weitere Informationen: volatile vs atomic & Volatile boolean vs AtomicBoolean

2

Probieren Sie diese

initialisieren

private AysncTask aysncTask; 

Aufgabe Aufrufmöglich-

aysncTask=new AysncTask(); 
     aysncTask.execute(); 

Aufgabe abbrechen Wo Sie WOLLEN

if (aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING){ 
     aysncTask.cancel(true); 

    }