https://developer.android.com/reference/android/os/AsyncTask
Es ist eine persönliche Kopie des Buches. Es tut mir leid, wenn ein Druckfehler oder eine Fehlübersetzung vorliegt.
[Multi-Thread-Zusammenfassung ist hier] (https://qiita.com/old_cat/items/a6d71f18a0789351c1a3)
public abstract class AsyncTask extends Object android.os.AsyncTask<Param,Progress,Result>
AsyncTask verarbeitet UI-Threads einfach und ordnungsgemäß. Verarbeiten Sie im Hintergrund und geben Sie das Ergebnis ohne Verwendung von Thread oder Handler an den UI-Thread zurück.
AsyncTask ist als Hilfsklasse konzipiert, die Thread, Handler usw. verarbeitet (instanziieren und verwenden: keine statische Methode). Es ist nicht als beliebtes Threading-Framework konfiguriert.
AsyncTask ist für die Verarbeitung in wenigen Sekunden geeignet. Wenn Sie längere Zeit Threads erstellen möchten, verwenden Sie die vom Paket java.util.concurrent bereitgestellten APIs, z. B. ** Executor, ThreadPoolExecuter, FutureTask **.
Asynchrone Aufgaben werden durch die Ergebnisse definiert, die im Hintergrundthread ausgeführt und an den UI-Thread übergeben werden. .. Das heißt, es wird in den folgenden Argumenttypen und in vier Schritten definiert.
** AsyncTask-Argumente **
Param
Progress
Result
** 4 Schritte **
onPreExecute
doInBackground
onProgressUpdate
onPostExecut
AsyncTask wird in Unterklassen unterteilt und verwendet, um mindestens eine oder mehrere Methoden (** doInBackground (Param ...) ) und in den meisten Fällen die zweite ( onPostExecute (Ergebnis)) zu überschreiben. **).
Unten finden Sie ein Beispiel für eine Unterklasse
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");
}
}
Einmal generiert, ist die Ausführung von Aufgaben wirklich einfach!
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTaskM<Param,Progress,Result>
Sie müssen nicht alle Typen verwenden, Sie können dies mit void tun. So was
private class MyTask extends AsyncTask<Void,Void,Void>
Wenn eine asynchrone Aufgabe ausgeführt wird, führt die Aufgabe vier Schritte aus.
Verwenden Sie Abbrechen (Boolea), um die Aufgabe abzubrechen. Wenn Sie cancel () ausführen (bei Erfolg), wird isCancelled () später aufgerufen und gibt true zurück. Wenn Sie doInBackground (java.lang.Object []) ausführen, wird normalerweise onPostExecute (java.lang.Object) ausgeführt. Wenn Sie jedoch cannel () ausführen, wird onCannelled (java.lang.Object) anstelle von onPostExecute () ausgeführt. Der Gefühlsfluss, der ausgeführt wird. DoInBackground (java.lang.Object []) gibt den Rückgabewert isCancelled () aus (true, wenn abgebrochen!). Um zu überprüfen, ob die Aufgabe ordnungsgemäß abgebrochen wurde, überprüfen Sie sie so schnell wie möglich!
Es gibt einige Regeln, um Threads richtig zu verwenden.
--AsyncTask wird auf der UI-Thread-Seite aufgerufen. Dies geschieht automatisch, nachdem die Android-Version JELLY_BEAN lautet.
AsyncTask stellt sicher, dass alle Rückruffunktionsaufrufe synchronisiert werden, um dies sicherzustellen, außer in expliziten Synchronisierungsfällen:
Anfänglich wurden AsyncTasks nacheinander in einem einzelnen Hintergrundthread verarbeitet. Von Build.VERSION_CODES.DONUT wurde die Android-Version in einen Thread-Pool geändert, um Multitasking zu verarbeiten, das parallel verarbeitet wird. Ab der Android-Version Build.VERSION_CODES.HONEYCOMB werden Aufgaben in einem einzigen Thread ausgeführt, um Anwendungsfehler durch Parallelität zu vermeiden.
Wenn Sie parallel verarbeiten möchten </ font>, ** THREAD_POOL_EXECUTOR ** und ** executeOnExecutor ** (java.util.concurrent.Executor) Führen Sie java.lang.Object []) </ font> aus! ..
■ Nested classes
enum |
AsiyncTask.Status |
Zeigt den aktuellen Status der Aufgabe td> tr> an |
■ Fields public static final Executor
SERIAL_EXECUTOR |
Executor td> tr>, der Aufgaben einzeln verarbeitet |
HREAD_POOL_EXECUTOR |
Executor, der während der Parallelverarbeitung verwendet wird td> tr> |
■ Public constructors
AsyncTask<> |
Neue Synchronisierungsaufgabe generieren td> tr> |
■ Public methods
final boolean | Abbrechen (boolean mayInterruptIfRunning) font> Aufgabe abbrechen < /td> |
final AsyncTask | ausführen (Params ... param) font> Aufgabe mit Parametern verarbeiten td> |
static void | execute (Runnable runnable) font> execute (java.lang.Object) td> für die einfache Verarbeitung einfacher Runnable-Objekte |
final AsyncTask | executeOnExecutor (Executor font> exec, Params ... param> Verarbeiten Sie die Aufgabe, indem Sie die Parameter td> angeben |
final Result | get(long timeout,TimeUnit unit) Wenn der Vorgang lange dauert, warten Sie und erhalten Sie das Ergebnis td> |
final Result | get() Warten Sie gegebenenfalls, um den Vorgang abzuschließen und das Ergebnis tdd> zu erhalten |
final AsyncTask.Status | getStatus font> Gibt den aktuellen Status der Aufgabe td> zurück |
final boolean | isCancelled() Gibt true zurück, wenn der Abbruch erfolgreich ist, bevor die Aufgabe erfolgreich abgeschlossen wurde td> |
Protected methods
abstract Result | doInBackground(Params... params) Eine Methode, die überschreibt, um die Verarbeitung in einem Hintergrundthread td> durchzuführen |
void | onCancelled() Überschreiben Sie onCancelled (java.lang.Object) font>, wenn Sie können! td> |
void | onCancelled(Result result) Nach dem Ausführen von wird cancel (boolean) font> und doInBackground (java.lang.Object []) font> beendet Läuft auf UI-Threads td> |
void | onPostExecute(Result result) Wird auf dem UI-Thread nach doInBackground (Params ...) font> td> ausgeführt |
void | onPreExecute() Führen Sie den UI-Thread vor doInBackground (Params ...) font> td> aus |
void | onProgressUpdate(Progress... values) Wird auf dem UI-Thread ausgeführt, nachdem PublishProgress (Progress ...) font> td> heißt |
final void | publishProgress(Progress... values) Diese Methode wird von doInBackground (Params ...) font> aufgerufen, um während der Verarbeitung im Hintergrund td> im UI-Thread zu aktualisieren |
From class java.lang.Object |
Verwenden Sie AsyncTask als Unterklasse AsyncTask<Params,Progress,Result>
Wenn AsyncTask keine Argumente erfordert, ist AsyncTask \ <void, void, void>
execute()
publishProgress()
@ Override-Methode (Überlassen Sie die Flugbahn dem Android-System)
onPreExecute()
doInBackground()
onProgressUpdate()
onPostExecute()
Eine Methode, die auf der UI-Thread-Seite ausgeführt werden soll. Führen Sie doInBackground aus, indem Sie ein Argument an die Override-Methode doInBackground () übergeben! ..
Beziehen Sie sich für den Argumenttyp auf den Argumenttyp von AsyncTask. Das Argument wird verwendet, um doInBackground () auszuführen.
Wenn Sie vor der Ausführung von Execute () eine Verarbeitung durchführen möchten, klicken Sie hier!
Erforderliche Methode überschreiben! </ font> Empfängt Argumente von execute () und verarbeitet Aufgaben im Hintergrund. Rufen Sie nach der Verarbeitung von doInBackground () onPostExecute () auf und übergeben Sie das Ergebnis der Verarbeitung von doInBackground () an onPostExecute (). Wenn Sie cancel () verwenden, wird onCannelled () anstelle von onPostExecute () aufgerufen. doInBackground () dient nur zur Aufgabenverarbeitung. Aktualisieren Sie den UI-Thread mit anderen Methoden!
Eine in doInBackground () verwendete Methode, um das Ergebnis von doInBackground () auf der UI-Thread-Seite anzuzeigen. Verwenden Sie das AsyncTask-Argument Result.
Bitte, wenn Sie die Fortschrittsanzeige verwenden möchten! Wenn Sie PublishProgress () auf doInBackground () ausführen, führt das Android-System onProgressUpdate () auf dem UI-Thread aus.
Wenn Sie PublishProgress () auf doInBackground () ausführen, führt das Android-System onProgressUpdate () auf dem UI-Thread aus. Beziehen Sie sich für das Argument auf das Argument von AsyncTask
--Subclass MainActivity.java
AsyncTask <> und execute () ausführen
public class MainActivity extends AppCompatActivity {
public static TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Erstellen Sie eine Aufgabeninstanz. Ausführen Ausführen Ausführen()Argument onInBackground()Übergeben an
// new MyAsyncTask().execute();Aber ok
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
}
}
class MyAsyncTask extends AsyncTask<Void,Void,Void> {
@Override
protected Void doInBackground(Void... aVoid) {
// todo
Log.d("msg","In MyAsyncTask");
return null;
}
}
Code, der die Anzeige von textView alle 3 Sekunden ändert
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
//Erstellen Sie eine Aufgabeninstanz. Ausführen Ausführen Ausführen()Argument onInBackground()Übergeben an
// new MyAsyncTask<>.execute();Aber ok
MyAsyncTask myAsyncTask = new MyAsyncTask();
// doInBackground()Zeichenkette zu("In doInBackground")Bestehen
// onPreExecute()Nach der Verarbeitung von doInBackground()Lauf
myAsyncTask.execute("In doInBackground");
}
class MyAsyncTask extends AsyncTask<String,String, String> {
// execute("In doInBackground")Vor der Verarbeitung ausführen. Wird in der Textansicht des UI-Threads angezeigt
@Override
protected void onPreExecute(){
textView.setText("onPreExecute");
}
// execute()Zeichenkette von"In doInBackground"Bekommen
@Override
protected String doInBackground(String... string) {
//Warten Sie 3 Sekunden
try {
sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Zeigen Sie textView während der Verarbeitung von doInBackground onPublishUpdate an()Anruf
publishProgress(string[0]);
//Warten Sie 3 Sekunden
try {
sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
// onPostExecute()Zeichenkette zu"End doInBackground"geben
return "End doInBackground";
}
//PublishProgress in doInBackground()Empfängt eine Zeichenfolge von und zeigt sie in der Textansicht des UI-Threads an
protected void onProgressUpdate(String... string){
textView.setText(string[0]);
}
// doInBackground()Rückgabewert von("End doInBackground")Wird in der Textansicht des UI-Threads empfangen und angezeigt
@Override
protected void onPostExecute(String s){
textView.setText(s);
}
}
}
MainActivity
...
new MyAsyncTask().execute("param1","param2");
MyAsyncTask
...
@Override
protected String doInBackground(String... string){
String param1 = string[0];
String param2 = string[1];
return null
}
MainActivity
Map<String,String> map = new HashMap<String,String>();
map.put("param1","data1");
map.put("param2","data2");
map.put("param3","data3");
new MyAsyncTask().execute(map);
MyAsyncTask
public class MyAsyncTask extends AsyncTask<Map<String,String>,Void,Map<String,String>>{
@Override
protected Map<String,String> doInBackground(Map<String,String>... map){
Map<String,String> mp = map[0];
//Wenn mp Json ist
// JSONObject jsonMap = new JSONObject(mp);
return mp;
}
@Override
protected void onPostExecute(Map<String,String> mp){
super.onPostExecute(mp);
String val1 = mp.get("param1"); //data1 wurde in val1 gespeichert
String val2 = mp.get("param1"); //data2 wurde in val2 gespeichert
String val3 = mp.get("param3"); //data3 wurde in val3 gespeichert
}
}
Es dauerte eine Weile. Die Schildkröte läuft wie gewohnt.