ich habe ein AsyncTask
Klasse, die ich ausführe und die eine große Liste von Daten von einer Website herunterlädt.
Für den Fall, dass der Endbenutzer zum Zeitpunkt der Verwendung eine sehr langsame oder fleckige Datenverbindung hat, möchte ich das AsyncTask
Zeitlimit nach einer bestimmten Zeit festlegen. Mein erster Ansatz dazu ist wie folgt:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
Nach dem Start von AsyncTask
wird ein neuer Handler gestartet, der den Vorgang AsyncTask
nach 30 Sekunden abbricht, wenn er noch ausgeführt wird.
Ist das ein guter Ansatz? Oder ist etwas eingebaut AsyncTask
, das für diesen Zweck besser geeignet ist?
java
android
android-asynctask
Jake Wilson
quelle
quelle
Antworten:
Ja, es gibt AsyncTask.get ()
Beachten Sie, dass durch Aufrufen im Hauptthread (AKA. UI-Thread) die Ausführung blockiert wird. Sie müssen ihn wahrscheinlich in einem separaten Thread aufrufen.
quelle
handler
Ansatz verwenden, den ich in meiner Frage beschreibe? Scheint viel einfacher zu sein, da der UI-Thread nicht einfriert, während er darauf wartet, das Handler's Runnable auszuführen ...In dem Fall, dass Ihr Downloader auf einer URL-Verbindung basiert, verfügen Sie über eine Reihe von Parametern, mit denen Sie ein Timeout ohne komplexen Code definieren können:
Wenn Sie diesen Code nur in Ihre asynchrone Aufgabe einbringen, ist dies in Ordnung.
'Read Timeout' dient zum Testen eines fehlerhaften Netzwerks während der gesamten Übertragung.
'Verbindungszeitlimit' wird nur zu Beginn aufgerufen, um zu testen, ob der Server aktiv ist oder nicht.
quelle
Verwenden Sie die CountDownTimer-Klasse neben der erweiterten Klasse für AsyncTask in der onPreExecute () -Methode:
Hauptvorteil ist die Async-Überwachung, die intern in der Klasse durchgeführt wird.
Wenn Sie beispielsweise CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000) ändern, wird onTick () 6 Mal aufgerufen, bevor onFinish () aufgerufen wird. Dies ist gut, wenn Sie eine Überwachung hinzufügen möchten.
Danke für all die guten Ratschläge, die ich auf dieser Seite bekommen habe :-)
quelle
Ich glaube nicht, dass so etwas in AsyncTask eingebaut ist. Ihr Ansatz scheint gut zu sein. Überprüfen Sie regelmäßig den Wert von isCancelled () in der doInBackground-Methode Ihrer AsyncTask, um diese Methode zu beenden, sobald der UI-Thread sie abbricht.
Wenn Sie die Verwendung des Handlers aus irgendeinem Grund vermeiden möchten, können Sie System.currentTimeMillis regelmäßig in Ihrer AsyncTask überprüfen und bei Zeitüberschreitung beenden, obwohl mir Ihre Lösung besser gefällt, da sie den Thread tatsächlich unterbrechen kann.
quelle
quelle
Sie können eine weitere Bedingung festlegen, um die Stornierung robuster zu gestalten. z.B,
quelle
Inspirierend von der Frage habe ich eine Methode geschrieben, die eine Hintergrundaufgabe über AsyncTask ausführt. Wenn die Verarbeitung länger als LOADING_TIMEOUT dauert, wird ein Warndialog zum erneuten Versuch angezeigt.
quelle