Tutorials  /  JavaScript

AsyncTask in Android: Ein Leitfaden zur Hintergrundverarbeitung

Ccentron Redaktion · Juni 2024 ·3 Min. Lesezeit ·JavaScript, Tutorial

Erfahren Sie, wie Sie mit Android AsyncTask schwere Aufgaben im Hintergrund ausführen und Ihre App reaktionsfähig halten. In diesem Tutorial zeigen wir Ihnen Schritt für Schritt, wie Sie AsyncTask implementieren und Ihre Benutzeroberfläche entlasten. Tauchen Sie ein in die Welt der effizienten Hintergrundverarbeitung für Android-Apps!

Was ist Android AsyncTask?

Android AsyncTask ist eine abstrakte Klasse, die es uns ermöglicht, schwere Aufgaben im Hintergrund auszuführen und gleichzeitig den UI-Thread leicht und reaktionsfähig zu halten. Android-Anwendungen laufen auf einem einzelnen Thread, was bedeutet, dass zeitaufwändige Aufgaben die Anwendung nicht reagieren lassen können. Um dies zu vermeiden, verwenden wir AsyncTask, um diese Aufgaben im Hintergrund auszuführen und die Ergebnisse an den UI-Thread zurückzugeben.

Wichtige Methoden der AsyncTask-Klasse

  1. doInBackground(): Hier wird der Code ausgeführt, der im Hintergrund laufen soll. Über die Methode publishProgress() können mehrmals Ergebnisse an den UI-Thread gesendet werden.
  2. onPreExecute(): Diese Methode wird ausgeführt, bevor die Hintergrundverarbeitung beginnt.
  3. onPostExecute(): Diese Methode wird nach Abschluss der Hintergrundverarbeitung aufgerufen und erhält das Ergebnis von doInBackground().
  4. onProgressUpdate(): Diese Methode empfängt Fortschrittsupdates von doInBackground(), veröffentlicht durch publishProgress().

Generische Typen der AsyncTask-Klasse

  1. Params: Typ der Parameter, die an die Aufgabe bei der Ausführung gesendet werden.
  2. Progress: Typ der Fortschrittseinheiten, die während der Hintergrundberechnung veröffentlicht werden.
  3. Result: Typ des Ergebnisses der Hintergrundberechnung.

Beispiel für eine AsyncTask-Anwendung

Um eine AsyncTask zu starten, muss der folgende Code in der MainActivity-Klasse vorhanden sein:

Code
MyTask myTask = new MyTask();
myTask.execute();

In diesem Beispiel haben wir eine Beispielklasse verwendet, die AsyncTask erweitert, und die execute-Methode wird verwendet, um den Hintergrundthread zu starten. Beachten Sie:

  • Die AsyncTask-Instanz muss im UI-Thread erstellt und aufgerufen werden.
  • Die in der AsyncTask-Klasse überschriebenen Methoden sollten niemals manuell aufgerufen werden, sie werden automatisch aufgerufen.
  • AsyncTask kann nur einmal aufgerufen werden, ein weiterer Aufruf führt zu einer Ausnahme.

Projektstruktur

Das XML-Layout ist in der activity_main.xml definiert und sieht wie folgt aus:

Code
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10pt"
        android:textColor="#444444"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="9dip"
        android:layout_marginTop="20dip"
        android:layout_marginLeft="10dip"
        android:text="Sleep time in Seconds:"/>
    <EditText
        android:id="@+id/in_time"
        android:layout_width="150dip"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background"
        android:layout_toRightOf="@id/tv_time"
        android:layout_alignTop="@id/tv_time"
        android:inputType="number"
        />
    <Button
        android:id="@+id/btn_run"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Run Async task"
        android:layout_below="@+id/in_time"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="64dp" />
    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="7pt"
        android:layout_below="@+id/btn_run"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

Java-Code für die MainActivity

Go
package com.journaldev.asynctask;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private Button button;
    private EditText time;
    private TextView finalResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        time = (EditText) findViewById(R.id.in_time);
        button = (Button) findViewById(R.id.btn_run);
        finalResult = (TextView) findViewById(R.id.tv_result);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AsyncTaskRunner runner = new AsyncTaskRunner();
                String sleepTime = time.getText().toString();
                runner.execute(sleepTime);
            }
        });
    }

    private class AsyncTaskRunner extends AsyncTask<String, String, String> {

        private String resp;
        ProgressDialog progressDialog;

        @Override
        protected String doInBackground(String... params) {
            publishProgress("Sleeping..."); // Calls onProgressUpdate()
            try {
                int time = Integer.parseInt(params[0])*1000;

                Thread.sleep(time);
                resp = "Slept for " + params[0] + " seconds";
            } catch (InterruptedException e) {
                e.printStackTrace();
                resp = e.getMessage();
            } catch (Exception e) {
                e.printStackTrace();
                resp = e.getMessage();
            }
            return resp;
        }

        @Override
        protected void onPostExecute(String result) {
            progressDialog.dismiss();
            finalResult.setText(result);
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MainActivity.this,
                    "ProgressDialog",
                    "Wait for "+time.getText().toString()+ " seconds");
        }

        @Override
        protected void onProgressUpdate(String... text) {
            finalResult.setText(text[0]);
        }
    }
}
VM

Passende Infrastruktur bei centron

Node-Anwendungen wollen deployt werden: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat – oder gleich als Managed Server, wenn der Betrieb nicht bei Ihnen liegen soll. Cloud Server mieten →

Fazit

Die AsyncTask-Klasse ermöglicht es Android-Entwicklern, zeitaufwändige Aufgaben im Hintergrund auszuführen und dabei die Benutzeroberfläche reaktionsfähig zu halten. Das obige Beispiel zeigt eine einfache Implementierung, bei der eine Aufgabe für eine bestimmte Zeit pausiert und den Fortschritt an die Benutzeroberfläche meldet.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie JavaScript
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren