711 Stimmen

AsyncTask Android Beispiel

Ich las gerade über AsyncTask und ich habe das folgende einfache Programm ausprobiert. Aber es scheint nicht zu funktionieren. Wie kann ich es zum Laufen bringen?

public class AsyncTaskActivity extends Activity {

    Button btn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener((OnClickListener) this);
    }

    public void onClick(View view){
        new LongOperation().execute("");
    }

    private class LongOperation extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            for(int i=0;i<5;i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed");
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }
}

Ich versuche gerade, die Beschriftung nach 5 Sekunden im Hintergrundprozess zu ändern.

Dies ist mein main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:indeterminate="false"
        android:max="10"
        android:padding="10dip">
    </ProgressBar>
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Progress" >
    </Button>
    <TextView android:id="@+id/output"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Replace"/>
</LinearLayout>

16voto

Rohit Singh Punkte 14318

Wie kann man sich die in AsyncTask verwendeten Parameter merken?

Nicht

Wenn Sie neu bei AsyncTask sind, ist es sehr üblich, dass Sie beim Schreiben einer AsyncTask verwirrt werden. Die Hauptschuldigen sind die in der AsyncTask verwendeten Parameter, d.h., AsyncTask<A, B, C> . Auf der Grundlage der A, B, C (Argumente) Die Signatur der Methoden ist unterschiedlich, was die Sache noch verwirrender macht.

Halten Sie es einfach!

Der Schlüssel ist nicht auswendig lernen . Wenn Sie sich vorstellen können, was Ihre Aufgabe wirklich tun muss, dann ist das Schreiben der AsyncTask mit der richtigen Signatur beim ersten Versuch ein Kinderspiel. Finden Sie einfach heraus, was Ihre Input , Progress et Output sind, und Sie sind startklar.

Was ist also eine AsyncTask?

AsyncTask ist eine Hintergrundaufgabe, die im Hintergrund-Thread läuft. Sie nimmt eine Input durchführt. Progress und gibt eine Output .

D.h. , AsyncTask<Input, Progress, Output> .

Zum Beispiel:

Enter image description here

Wie ist die Beziehung zu den Methoden?

Zwischen AsyncTask y doInBackground()

Enter image description here

doInBackground() y onPostExecute(), onProgressUpdate()` sind auch verwandt

Enter image description here

Wie schreibt man das in den Code?

DownloadTask extends AsyncTask<String, Integer, String>{

    // Always same signature
    @Override
    public void onPreExecute()
    {}

    @Override
    public String doInbackGround(String... parameters)
    {
        // Download code
        int downloadPerc = // Calculate that
        publish(downloadPerc);

        return "Download Success";
    }

    @Override
    public void onPostExecute(String result)
    {
        super.onPostExecute(result);
    }

    @Override
    public void onProgressUpdate(Integer... parameters)
    {
        // Show in spinner, and access UI elements
    }

}

Wie werden Sie diese Aufgabe ausführen?

new DownLoadTask().execute("Paradise.mp3");

14voto

TT-- Punkte 2601

Hintergrund / Theorie

AsyncTask ermöglicht es Ihnen, eine Aufgabe auf einem Hintergrund-Thread laufen zu lassen, während die Ergebnisse auf dem UI-Thread veröffentlicht werden.

Der Benutzer sollte immer in der Lage sein, mit der App zu interagieren, damit sie wichtig um ein Blockieren des Haupt-(UI-)Threads zu vermeiden mit Aufgaben wie Herunterladen von Inhalten aus dem Internet.

Aus diesem Grund verwenden wir eine AsyncTask .

Es bietet eine unkomplizierte Schnittstelle durch Verpackung der UI-Thread-Nachrichtenwarteschlange und -Handler, die es Ihnen ermöglichen, lauffähige Objekte und Nachrichten von anderen Threads zu senden und zu verarbeiten .

Umsetzung

AsyncTask ist eine generische Klasse. (Sie nimmt parametrisierte Typen in seinem Konstruktor).

Sie verwendet diese drei generische Typen:

Params - den Typ der Parameter, die bei der Ausführung an die Aufgabe gesendet werden.

Progress - den Typ der Fortschrittseinheiten, die während der Hintergrundberechnung veröffentlicht werden.

Result - den Typ des Ergebnisses der Hintergrundberechnung.

Nicht alle Typen werden immer von einer asynchronen Aufgabe verwendet. Um einen Typ als unbenutzt zu kennzeichnen, verwenden Sie einfach den Typ Void:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

Diese drei Parameter entsprechen drei Hauptfunktionen können Sie überschreiben in AsyncTask :

  • doInBackground(Params...)
  • onProgressUpdate(Progress...)
  • onPostExecute(Result)

So führen Sie AsyncTask aus

  • Rufen Sie an. execute() mit Parametern, die an die Hintergrundaufgabe gesendet werden.

Was passiert

  1. Auf Haupt-/UI-Thread , onPreExecute() genannt wird.

    • Um etwas in diesem Thread zu initialisieren. (z.B. einen Fortschrittsbalken auf der Benutzeroberfläche anzeigen.)
  2. Bei einem Hintergrund-Thread , doInBackground(Params...) genannt wird.

    • ( Params wurden übergeben über execute .)

    • Wo die Daueraufgabe stattfinden soll.

    • Muss mindestens überschreiben doInBackground() AsyncTask zu verwenden.

    • Rufen Sie an. publishProgress(Progress...) die Benutzeroberfläche mit einer Fortschrittsanzeige zu aktualisieren (z. B. UI-Animation oder Protokolltext), während die Hintergrundberechnung noch läuft.

      • Verursacht onProgressUpdate() angerufen werden.
  3. Auf der Hintergrund-Thread wird ein Ergebnis zurückgegeben von doInBackground() .

    • (Dies löst den nächsten Schritt aus.)
  4. Auf Haupt-/UI-Thread , onPostExecute() wird mit dem zurückgegebenen Ergebnis aufgerufen.

Beispiele

In beiden Beispielen ist die "blockierende Aufgabe" ein Download aus dem Internet.

  • Beispiel A Downloads ein Bild und zeigt es in einer ImageView an, während
  • Beispiel B Downloads einige Dateien .

Beispiel A

Le site doInBackground() Methode lädt das Bild herunter und speichert es in einem Objekt vom Typ BitMap. Die onPostExecute() Methode nimmt das Bitmap und platziert es in der ImageView.

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bitImage;

    public DownloadImageTask(ImageView bitImage) {
        this.bitImage = bitImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mBmp = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mBmp = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mBmp;
    }

    protected void onPostExecute(Bitmap result) {
        bitImage.setImageBitmap(result);
    }
}

Beispiel B

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

Beispiel B Ausführung

new DownloadFilesTask().execute(url1, url2, url3);

12voto

Ganesh Katikar Punkte 2570

Wenn eine asynchrone Aufgabe ausgeführt wird, durchläuft sie vier Schritte:

  1. onPreExecute()
  2. doInBackground(Params...)
  3. onProgressUpdate(Fortschritt...)
  4. onPostExecute(Ergebnis)

Nachfolgend finden Sie ein Demo-Beispiel:

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

Und einmal erstellt, wird eine Aufgabe sehr einfach ausgeführt:

new DownloadFilesTask().execute(url1, url2, url3);

11voto

Oded Breiner Punkte 26754

Das kürzeste Beispiel, um etwas asynchron zu tun:

class MyAsyncTask extends android.os.AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        // Do something asynchronously
        return null;
    }
}

Um es auszuführen:

(new MyAsyncTask()).execute();

6voto

kc ochibili Punkte 3017

Ich würde Ihnen empfehlen, sich das Leben zu erleichtern, indem Sie diese Bibliothek für Hintergrundarbeiten verwenden:

https://github.com/Arasthel/AsyncJobLibrary

Es ist so einfach...

AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() {

    @Override
    public void doOnBackground() {
        startRecording();
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X