Abbrechen AsyncTask nach einiger Zeit
Könnte dies eine doppelte Frage, aber ich fand nicht was ich suchte.
Ich rufe einen AsyncTask in der UI-Aktivität new LoadData().execute();
und in doInBackground rufe ich eine Methode, die Zeit braucht. Ich will unterbrechen diesen thread, wenn die Daten nicht wieder nach einiger Zeit.
Unten ist der code, wie ich versuchte, dies zu tun.
class LoadData extends AsyncTask<String, String, String>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
startTime = System.currentTimeMillis();
}
protected String doInBackground(String... args)
{
DataCollector dc = new DataCollector();
data = dc.collectData(query);
//Here I check if the time is greater than 30 seconds then cancel
if(((System.currentTimeMillis()-startTime)/1000)>30)
{
cancel(true);
}
return null;
}
}
Aber das bedeutet nicht aufhören, die Aufgabe nach 30 Sekunden, in der Tat ist es mehr Zeit nehmen.
Ich habe versucht get(long timeout, TimeUnit unit);
als gut, aber dass funktioniert auch nicht.
Kann jemand mir zeigen, wie kann ich es machen, oder wie verwende ich isCancelled() in doInBackground.
Dank.
- Vielleicht ist diese Antwort hilft dir: stackoverflow.com/a/11191070/3307066.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benötigen Sie einen thread, der bricht die Aufgabe nach einer gewissen Zeit. Dieser Thread könnte so Aussehen:
Und wenn Sie rufen Sie Ihren AsyncTask, die Sie benötigen, um ausführen die absagen Aufgabe nach einer gewissen Zeit (=das Zeitlimit (in diesem Fall 20 Sek.)
Ist es eine gute Idee, wenn Sie sauber bis Sie auf Abbrechen oder beenden mit
Natürlich können Sie wickeln Sie diesen in eine benutzerdefinierte Implementierung von AsyncTask. Ich habe dieses Muster viele Male und es funktioniert wie ein Charme. Eine Sache zu beachten, in seltenen Fällen kann die Prozedur würde nicht starten, ich vermute, wenn Sie es schaffen, in den falschen Kontext er wird nicht überleben, in bestimmten Fällen, so ich gezwungen, der handler sein, der UI-Thread mit
handler= new Handler(Looper.getMainLooper());
Müssen Sie die Zeit zu überprüfen, in einem anderen thread.
Was Sie derzeit tun ist: Ausführung der
dc.collectData(query)
(im hintergrund) und, sobald es bereit ist, die Sie überprüfen, wenn Sie absagen sollten. Also, wenn die Abfrage dauert nur 1 minute, nehmen Sie dann die cancel-check nach 1 minute, das ist schon zu spät.Was Sie tun können, planen Sie einen TimerTask, der ausgeführt werden soll 30 Sekunden nach der LoadData().execute() und wenn der timer-Task ausgeführt wird, können Sie Abbrechen, die AsyncTask (falls es noch läuft)
Ich würde es übersetzen in eine async/await problem damit, die ganzen teuren Methoden wie async-Methoden.
Ersten, Ändern Datensammelpunkt ist collectData(query) zu collectDataAsync(Abfrage). (Wenn Sie nicht zu ändern Sein, es gibt Problemumgehungen Arbeit, um wickeln Sie es in eine lambda-Funktion oder etwas ähnliches).
Zweitens ändern doInBackground als asynchrone Aufgabe, so etwas wie dieses:
Grundsätzlich haben Sie zwei Aufgaben innerhalb von doInBackgroundAsync: collectDataAsync und eine delay-Aufgabe.
Dein code wartet, bis der schnellere. Dann wissen Sie, was man war und man kann entsprechend reagieren.
Wenn Sie auch zu stornieren collectDataAsync Aufgabe, dann will man verwendet ein cancellationToken.
Ich verwende dies, um Ihr problem zu lösen https://stackoverflow.com/a/11191070/3307066.
Beachten Sie, dass jetzt doInBackgroundAsync ist eine asynchrone, so ändert es ein wenig die Art und Weise der Verwendung.
Hoffe, es hilft.
versuchen Sie dies :
Mit freundlicher Genehmigung und für mehr details, Lesen Sie diese Antwort.
cancel(true)
scheint nicht zu funktionieren für mich. Wie kann ichget(long timeout, TimeUnit unit);
da ist, klingt mehr machbar.Kurze Antwort ist: Sie KÖNNEN NICHT kündigen ein AsyncTask einmal seine Schritte. Was Sie tun können, ist legen Sie eine Schleife in
doInBackGround()
Prüfung fürisCancelled()
und wenn es auf true festgelegt ist, irgendwann in der Zukunft - einen Wert zurückgeben von der Funktion (die wiederum rufenonPostExecute()
wenn Sie es definiert);Beachten Sie, dass, nur weil Sie nicht aufhören können, einen AsyncTask bedeutet nicht, dass das OS wird nicht Abbrechen, wenn es nicht genügend Speicher. Sie sollten dies im Hinterkopf, wenn Sie sind dabei wesentliche Aufgaben in der AsyncTask (diejenigen, die Sie wollen ausgeführt, 100%). Wenn dem so ist, ist es besser, verwenden Sie ein Service - eine Komponente, die automatisch gekillt und neu gestartet vom Betriebssystem benötigen.
cancel(boolean state); get(long timeout, TimeUnit unit);
Methoden verfügbar?