[JAVA] Programmierung ab 51 Jahren Hinweis AsyncTask - Referenz [Shakyo]

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>

Wie ist es bei der postasynchronen Kommunikationsverarbeitung und Verallgemeinerung von AsyncTask üblich? Info

AsyncTask-Übersicht

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.

Wie benutzt man

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);

AsyncTask-Argumente

AsyncTaskM<Param,Progress,Result>

  1. ** Param **
    Parametertyp, der zur Laufzeit an die Task übergeben werden soll
  2. ** Fortschritt **
    Der Typ der Fortschrittseinheit, die während der Hintergrundverarbeitung angezeigt werden soll
  3. ** Ergebnis **
    Art des Ergebnisses der Hintergrundverarbeitung

Sie müssen nicht alle Typen verwenden, Sie können dies mit void tun. So was

 private class MyTask extends AsyncTask<Void,Void,Void>

4 Schritte

Wenn eine asynchrone Aufgabe ausgeführt wird, führt die Aufgabe vier Schritte aus.

  1. ** onPreExecute () **
    Eine vorbereitende Methode zum Aufrufen des UI-Threads, bevor die Aufgabe verarbeitet wird. Wenn Sie beispielsweise den Fortschrittsbalken beim Ausführen von Execute () anzeigen möchten, möchten Sie sich darauf vorbereiten, den Fortschrittsbalken mit onPreExecute () anzuzeigen.
  2. doInBackground (Params ...) </ font> </ strong>: Überschreiben erforderlich
    onPreExecute () Wird unmittelbar nach der Verarbeitung im Hintergrundthread aufgerufen .. Dies ist ein Schritt für die Verarbeitung, der auch dann in Ordnung ist, wenn die Hintergrundverarbeitung einige Zeit in Anspruch nimmt. In diesem Schritt werden die Parameter für die asynchrone Aufgabe übergeben. Das Verarbeitungsergebnis wird in diesem Schritt immer zurückgegeben und das Ergebnis an den letzten Schritt übergeben. Dieser Schritt kann auch für PublishProgress (Progress) verwendet werden, in dem Fortschrittseinheiten angezeigt werden. In diesem Fall wird er im UI-Thread im Schritt onProgressUpdate (Progress ...) angezeigt.
  3. ** onProgressUpdate (Progress ...) **
    Wird vom UI-Thread nach Ausführung von PublishProgress (Progress ...) aufgerufen. Der Zeitpunkt der Ausführung ist undefiniert. Diese Methode wird verwendet, um verschiedene Fortschrittsformulare anzuzeigen. Fortschrittsformulare werden während der Hintergrundverarbeitung in der Benutzeroberfläche angezeigt. Beispiel: Animationsfortschrittsleiste oder Protokollanzeige im Textfeld.
  4. ** onPostExecute (Ergebnis) **
    Wird vom UI-Thread aufgerufen, nachdem die Hintergrundverarbeitung abgeschlossen ist. Das Ergebnis der Hintergrundverarbeitung wird in diesem Schritt als Parameter zurückgegeben.

Aufgabenabbruch

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!


Thread-Regeln

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.

  • ** Taskinstanz wird auf der UI-Thread-Seite erstellt **
  • ** Execute execute (Params ...) auf der UI-Seite **
  • Rufen Sie onPreExesute (), onPostExecute (Ergebnis), doInBackground (Kinderwagen ...) und onProgressUpdate (Fortschritt ...) nicht direkt auf. Überlassen Sie es dem Android-System!
  • Die Aufgabe kann nur einmal ausgeführt werden. Wenn es ein zweites Mal ausgeführt wird, wird eine Ausnahme ausgelöst.

Überprüfen Sie den Speicher

AsyncTask stellt sicher, dass alle Rückruffunktionsaufrufe synchronisiert werden, um dies sicherzustellen, außer in expliziten Synchronisierungsfällen:

  • Die Speicherauswirkungen von onPreExecute (), die Speicherauswirkungen von Methoden, die vor dem Aufruf von execute (Params ...) usw. ausgeführt wurden (Konstruktion des AsyncTask-Objekts), werden in doInBackground (Params ...) angezeigt.
  • doInBackground(Params...) Die Auswirkungen auf den Speicher werden in onPostExecute (Ergebnis) angezeigt.
  • Die Speicherauswirkung von doInBackgrund (Params ...) vor dem Aufruf von PublishProgress (Progres ...) wird im entsprechenden onProgressUpdate (Progress ..) angezeigt. DoInBackground (Params ...) wird jedoch weiterhin ausgeführt, sodass die Aktualisierung von doInBackground (Params ...) auf ProgressUpdata (Progress ...) ausgeführt wird. Achten Sie darauf, den Anruf nicht zu stören.
  • Die Speicherauswirkung von cancel (boolean) ist nach einem Aufruf von isCancelled () sichtbar (gibt im Ausführungsergebnis true zurück), der vor calquek (boolean) oder während oder nach dem Aufruf von onCancelled () aufgerufen wird. Ich werde.

Hintergrund von AsyncTask

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! ..

Überblick

■ Nested classes

enum
AsiyncTask.Status
Zeigt den aktuellen Status der Aufgabe an

■ Fields public static final Executor

SERIAL_EXECUTOR
Executor , der Aufgaben einzeln verarbeitet
HREAD_POOL_EXECUTOR
Executor, der während der Parallelverarbeitung verwendet wird

■ Public constructors

AsyncTask<>
Neue Synchronisierungsaufgabe generieren

■ Public methods

final boolean Abbrechen (boolean mayInterruptIfRunning)
Aufgabe abbrechen < /td>
final AsyncTask ausführen (Params ... param)
Aufgabe mit Parametern verarbeiten
static void execute (Runnable runnable)
execute (java.lang.Object) für die einfache Verarbeitung einfacher Runnable-Objekte
final AsyncTask executeOnExecutor (Executor exec, Params ... param>
Verarbeiten Sie die Aufgabe, indem Sie die Parameter angeben
final Result get(long timeout,TimeUnit unit)
Wenn der Vorgang lange dauert, warten Sie und erhalten Sie das Ergebnis
final Result get()
Warten Sie gegebenenfalls, um den Vorgang abzuschließen und das Ergebnis zu erhalten
final AsyncTask.Status getStatus
Gibt den aktuellen Status der Aufgabe zurück
final boolean isCancelled()
Gibt true zurück, wenn der Abbruch erfolgreich ist, bevor die Aufgabe erfolgreich abgeschlossen wurde

Protected methods

abstract Result doInBackground(Params... params)
Eine Methode, die überschreibt, um die Verarbeitung in einem Hintergrundthread durchzuführen
void onCancelled()
Überschreiben Sie onCancelled (java.lang.Object) , wenn Sie können!
void onCancelled(Result result)
Nach dem Ausführen von wird cancel (boolean) und doInBackground (java.lang.Object []) beendet Läuft auf UI-Threads
void onPostExecute(Result result)
Wird auf dem UI-Thread nach doInBackground (Params ...) ausgeführt
void onPreExecute()
Führen Sie den UI-Thread vor doInBackground (Params ...) aus
void onProgressUpdate(Progress... values)
Wird auf dem UI-Thread ausgeführt, nachdem PublishProgress (Progress ...) heißt
final void publishProgress(Progress... values)
Diese Methode wird von doInBackground (Params ...) aufgerufen, um während der Verarbeitung im Hintergrund im UI-Thread zu aktualisieren
Vererbte Methode
From class java.lang.Object

AsyncTask-Zusammenfassung

Verwenden Sie AsyncTask als Unterklasse AsyncTask<Params,Progress,Result>

  • Geben Sie den Argumenttyp an, der von Params verwendet wird.
    doInBackground () --Progress
    Art der Methode zum Anzeigen laufender Informationen für den Benutzer
    Geben Sie den Argumenttyp an, der in PublishProgress (), onProgressUpdate () verwendet werden soll. --Ergebnis
    Ergebnisanzeigemethode
    Geben Sie den in onPostExecute () verwendeten Argumenttyp an.

Wenn AsyncTask keine Argumente erfordert, ist AsyncTask \ <void, void, void>

Hauptmethoden

  • execute()

  • publishProgress()

  • @ Override-Methode (Überlassen Sie die Flugbahn dem Android-System)

  • onPreExecute()

  • doInBackground()

  • onProgressUpdate()

  • onPostExecute()

・ Ausführen (Params ... params)

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.

・ OnPreExecute

Wenn Sie vor der Ausführung von Execute () eine Verarbeitung durchführen möchten, klicken Sie hier!

・ DoInBackground ()

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!

・ OnPostExecute ()

Eine in doInBackground () verwendete Methode, um das Ergebnis von doInBackground () auf der UI-Thread-Seite anzuzeigen. Verwenden Sie das AsyncTask-Argument Result.

・ PublishedProgress ()

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.

・ OnProgressUpdate ()

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


Beispielcode: execute () und doInBackground ()

--Subclass MainActivity.java
AsyncTask <> und execute () ausführen

  • Erweitern Sie die AsyncTask <> -Klasse, um die MyAsyncTask-Klasse zu generieren.
    doInBackground () führt den Prozess durch execute () von MainActivity.java (zu erledigen) aus. doInBackground () empfängt ein Argument von execute () und verwendet es zur Verarbeitung.
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;
    }
}

Beispielcode: Versuchen Sie, einige Methoden einzugeben

Code, der die Anzeige von textView alle 3 Sekunden ändert

  • MyActivity.onCreate()
    myAsncTask.excute("In doInBackground")
  • class MyAsyncTask
    • onPreExecute()
      textView.setText("onPreExecute")
    • doInBackground()
      sleep(10003) -> publishProgress(string[0]) -> sleep(10003) -> return "End doInBackground"
    • onProgressUpdate()
      textView.setText(string[0])
    • onPostExecute()
      textView.setText(s)
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);
        }
    }
}

Übergeben Sie die Parameter von Activity an AsyncTask

Übergeben Sie mehrere Parameter nacheinander

MainActivity


...
new MyAsyncTask().execute("param1","param2");

MyAsyncTask


...
@Override
protected String doInBackground(String... string){
   String param1 = string[0];
   String param2 = string[1];
return null
}

Übergeben Sie mehrere Parameter als Array

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.

Recommended Posts