AsyncTask Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen.
[Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })]
public abstract class AsyncTask : Java.Lang.Object
[<Android.Runtime.Register("android/os/AsyncTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "Params", "Progress", "Result" })>]
type AsyncTask = class
inherit Object
- Vererbung
- Abgeleitet
- Attribute
Hinweise
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. Der am häufigsten verwendete Anwendungsfall war jedoch für die Integration in die Benutzeroberfläche, was zu Kontextlecks, verpassten Rückrufen oder Abstürzen bei Konfigurationsänderungen führen würde. Es hat auch inkonsistentes Verhalten in verschiedenen Versionen der Plattform, verschluckt Ausnahmen von doInBackgroundund bietet nicht viel Nutzen über die direkte Verwendung Executorvon s.
AsyncTask ist als Hilfsklasse Thread konzipiert und Handler stellt kein generisches Threadingframework dar. AsyncTasks sollten idealerweise für kurze Vorgänge (höchstens einige Sekunden) verwendet werden.) Wenn Sie Threads über einen längeren Zeitraum ausführen müssen, wird dringend empfohlen, die verschiedenen APIs zu verwenden, die java.util.concurrent vom Paket bereitgestellt werden, z Executor. B. und ThreadPoolExecutorFutureTask.
Eine asynchrone Aufgabe wird durch eine Berechnung definiert, die in einem Hintergrundthread ausgeführt wird und dessen Ergebnis im UI-Thread veröffentlicht wird. Eine asynchrone Aufgabe wird durch 3 generische Typen definiert, die aufgerufen Paramswerden, und Progress4 Schritte, die als Result, onPreExecuteund doInBackgroundonProgressUpdate . onPostExecute
<div class="special reference"><h3>Developer Guides</h3>
Weitere Informationen zur Verwendung von Aufgaben und Threads finden Sie im Entwicklerhandbuch für Prozesse und Threads .
</Div>
<h2>Verwendung</h2>
AsyncTask muss unterklassig sein, damit sie verwendet werden kann. Die Unterklasse überschreibt mindestens eine Methode (#doInBackground), und meistens wird eine zweite (#onPostExecute.) außer Kraft setzen.
Hier ist ein Beispiel für Unterklassen:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Nach der Erstellung wird eine Aufgabe sehr einfach ausgeführt:
new DownloadFilesTask().execute(url1, url2, url3);
<generische Typen>/h2 von h2<AsyncTask>
Die drei Typen, die von einer asynchronen Aufgabe verwendet werden, sind die folgenden:
<ol><li>Params, der Typ der Parameter, die bei der Ausführung an die Aufgabe gesendet werden.</li li><>Progress, der Typ der Statuseinheiten, die während der Hintergrundberechnung veröffentlicht wurden.</li li><>Result, der Typ des Ergebnisses der Hintergrundberechnung.</li></ol>
Nicht alle Typen werden immer von einer asynchronen Aufgabe verwendet. Um einen Typ als nicht verwendet zu markieren, verwenden Sie einfach den Typ Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
<h2>Die 4 Schritte</h2>
Wenn eine asynchrone Aufgabe ausgeführt wird, durchläuft die Aufgabe vier Schritte:
<ol><li>#onPreExecute(), aufgerufen im UI-Thread, bevor die Aufgabe ausgeführt wird. Dieser Schritt wird normalerweise verwendet, um die Aufgabe einzurichten, z. B. durch Anzeigen einer Statusanzeige auf der Benutzeroberfläche.</li li><>#doInBackground, wird unmittelbar nach #onPreExecute() Abschluss der Ausführung im Hintergrundthread aufgerufen. Dieser Schritt wird verwendet, um die Hintergrundberechnung durchzuführen, die eine lange Zeit in Anspruch nehmen kann. Die Parameter der asynchronen Aufgabe werden an diesen Schritt übergeben. Das Ergebnis der Berechnung muss von diesem Schritt zurückgegeben werden und wird an den letzten Schritt übergeben. Dieser Schritt kann auch zum Veröffentlichen einer oder mehrerer Fortschrittseinheiten verwendet werden #publishProgress . Diese Werte werden im UI-Thread im #onProgressUpdate Schritt veröffentlicht.</li li><>#onProgressUpdate, aufgerufen im UI-Thread nach einem Aufruf von .#publishProgress Der Zeitpunkt der Ausführung ist nicht definiert. Diese Methode wird verwendet, um jede Form des Fortschritts auf der Benutzeroberfläche anzuzeigen, während die Hintergrundberechnung noch ausgeführt wird. Beispielsweise kann es verwendet werden, um eine Statusleiste zu animieren oder Protokolle in einem Textfeld anzuzeigen.</li li><>#onPostExecute, aufgerufen im UI-Thread, nachdem die Hintergrundberechnung abgeschlossen wurde. Das Ergebnis der Hintergrundberechnung wird als Parameter an diesen Schritt übergeben.</li></ol>
<h2>Abbrechen eines Vorgangs</h2>
Eine Aufgabe kann jederzeit durch Aufrufen #cancel(boolean)abgebrochen werden. Das Aufrufen dieser Methode führt dazu #isCancelled() , dass nachfolgende Aufrufe "true" zurückgeben. Nach dem Aufrufen dieser Methode #onCancelled(Object)wird anstelle von #onPostExecute(Object) Rückgaben #doInBackground(Object[]) die Methode aufgerufen. Um sicherzustellen, dass eine Aufgabe so schnell wie möglich abgebrochen wird, sollten Sie den Rückgabewert #isCancelled() in regelmäßigen Abständen von #doInBackground(Object[]), falls möglich (z. B. innerhalb einer Schleife), überprüfen.)
<h2>Threadingregeln</h2>
Es gibt einige Threadingregeln, die befolgt werden müssen, damit diese Klasse ordnungsgemäß funktioniert:
<ul><li>Die AsyncTask-Klasse muss im UI-Thread geladen werden. Dies erfolgt automatisch ab android.os.Build.VERSION_CODES#JELLY_BEAN.</li Li><>Die Aufgabeninstanz muss im UI-Thread erstellt werden.</li li><>#execute muss im UI-Thread aufgerufen werden.</li li><>Nicht anrufen #onPreExecute(), , #onPostExecute, #doInBackground#onProgressUpdate manuell.</li Li><>Die Aufgabe kann nur einmal ausgeführt werden (eine Ausnahme wird ausgelöst, wenn eine zweite Ausführung versucht wird.)</li></ul>
<h2>Speicher observability</h2>
AsyncTask garantiert, dass alle Rückrufaufrufe synchronisiert werden, um Folgendes ohne explizite Synchronisierungen sicherzustellen.
<ul><li>Die Speichereffekte und #onPreExecutealles andere, was vor dem Aufruf #executeausgeführt wird, einschließlich der Konstruktion des AsyncTask-Objekts, sind sichtbar.#doInBackground
<li>Die Speichereffekte von #doInBackground sind sichtbar für #onPostExecute.
<li>Alle Speichereffekte des #doInBackground vorherigen Aufrufs #publishProgress sind für den entsprechenden #onProgressUpdate Aufruf sichtbar. (Es wird jedoch #doInBackground weiterhin ausgeführt, und es muss darauf geachtet werden, dass spätere Aktualisierungen #doInBackground keinen Konflikt mit einem laufenden #onProgressUpdate Anruf haben.) <li>Alle Speichereffekte, die einem Aufruf #cancel vorausgehen, sind nach einem Aufruf sichtbar, der #isCancelled "true" als Ergebnis oder während und nach einem resultierenden Aufruf zurückgibt #onCancelled.
</ul>
<h2>Reihenfolge der Ausführung</h2>
Bei der ersten Einführung wurden AsyncTasks serial in einem einzelnen Hintergrundthread ausgeführt. Beginnend mit android.os.Build.VERSION_CODES#DONUT, wurde dies in einen Pool von Threads geändert, sodass mehrere Aufgaben parallel ausgeführt werden können. Beginnend mit android.os.Build.VERSION_CODES#HONEYCOMB, werden Aufgaben in einem einzigen Thread ausgeführt, um häufige Anwendungsfehler zu vermeiden, die durch parallele Ausführung verursacht werden.
Wenn Sie wirklich parallele Ausführung wünschen, können Sie mit #executeOnExecutor(java.util.concurrent.Executor, Object[]).#THREAD_POOL_EXECUTOR
Dieses Element ist veraltet. Verwenden Sie stattdessen die Standard java.util.concurrent - oder Kotlin-Parallelitätshilfsprogramme .
Java Dokumentation für android.os.AsyncTask.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
| Name | Beschreibung |
|---|---|
| AsyncTask() |
Erstellt eine neue asynchrone Aufgabe. |
| AsyncTask(IntPtr, JniHandleOwnership) |
Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Laufzeit aufgerufen. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Class |
Gibt die Laufzeitklasse dieses Werts |
| Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
| IsCancelled |
Gibt zurück |
| JniIdentityHashCode |
Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist. (Geerbt von Object) |
| JniManagedPeerState |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| JniPeerMembers |
Stellt JNI-Peer-Membermetadaten für diesen Typ bereit. |
| PeerReference |
Ruft den JNI-Objektverweis für diesen Java Peer ab. (Geerbt von Object) |
| SerialExecutor |
Eine |
| ThreadPoolExecutor |
Eine |
| ThresholdClass |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
| ThresholdType |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. |
Methoden
| Name | Beschreibung |
|---|---|
| Cancel(Boolean) |
Versucht, die Ausführung dieser Aufgabe abzubrechen. |
| Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| Dispose() |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| Dispose(Boolean) |
Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden. (Geerbt von Object) |
| DisposeUnlessReferenced() |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| DoInBackground(Object[]) |
Überschreiben Sie diese Methode, um eine Berechnung für einen Hintergrundthread auszuführen. |
| Equals(Object) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| Equals(Object) |
Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist. (Geerbt von Object) |
| Execute(IRunnable) |
Komfortversion für |
| Execute(Object[]) |
Führt die Aufgabe mit den angegebenen Parametern aus. |
| ExecuteOnExecutor(IExecutor, Object[]) |
Führt die Aufgabe mit den angegebenen Parametern aus. |
| Get() |
Wartet, falls erforderlich, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab. |
| Get(Int64, TimeUnit) |
Wartet, falls erforderlich, bis die Berechnung abgeschlossen ist, und ruft dann das Ergebnis ab. |
| GetAsync() |
Führt asynchron den entsprechenden Vorgang aus. |
| GetAsync(Int64, TimeUnit) |
Führt asynchron den entsprechenden Vorgang aus. |
| GetHashCode() |
Gibt einen Hashcodewert für das Objekt zurück. (Geerbt von Object) |
| GetStatus() |
Gibt den aktuellen Status dieses Vorgangs zurück. |
| JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind. (Geerbt von Object) |
| Notify() |
Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet. (Geerbt von Object) |
| NotifyAll() |
Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten. (Geerbt von Object) |
| OnCancelled() |
Anwendungen sollten vorzugsweise außer Kraft setzen |
| OnCancelled(Object) |
Wird im UI-Thread ausgeführt, nachdem |
| OnPostExecute(Object) |
Wird im UI-Thread nach |
| OnPreExecute() |
Wird im UI-Thread vor |
| OnProgressUpdate(Object[]) |
Wird im UI-Thread ausgeführt, nachdem |
| PublishProgress(Object[]) |
Diese Methode kann aufgerufen |
| SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| ToArray<T>() |
Erstellt ein verwaltetes Array aus diesem Java Arraywrapper. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
| UnregisterFromRuntime() |
Hebt die Registrierung dieses Java Peers aus der Interop-Laufzeit auf. (Geerbt von Object) |
| Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em< oder >em<unterbrochen>/em<.><> (Geerbt von Object) |
| Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
| Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| IJavaPeerable.Disposed() |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| IJavaPeerable.Finalized() |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. (Geerbt von JavaObject) |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Ruft den JNI-Namen des Typs der Instanz |
| JavaAs<TResult>(IJavaPeerable) |
Versuchen Sie, die Eingabe |
| JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
| JavaCast<TResult>(IJavaObject) |
AsyncTask sollte die ordnungsgemäße und einfache Verwendung des UI-Threads ermöglichen. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Versuchen Sie, die Eingabe |