android-asynctaskAan de slag met android-asynctask


Opmerkingen

Deze sectie biedt een overzicht van wat Android-asynctask is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen Android-asynctask vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de documentatie voor android-asynctask nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

AsyncTask van concept tot implementatie

Concept

AsyncTask is een klasse die het uitvoeren van bewerkingen op de achtergrond toestaat, waarbij de resultaten op de UI-thread worden gepubliceerd. Het hoofddoel is het elimineren van alle boilerplate-code voor het starten / uitvoeren van een thread door de handlers en alle dingen die nodig zijn voor het manipuleren van de threads te verwijderen. Het doel van AsyncTask is ook om korte-tijd-bewerkingen op een achtergrondthread (maximaal enkele seconden) te hebben, niet om langdurige bewerkingen te hebben. Het is daarom belangrijk dat AsyncTask niet wordt verward met een generiek threading-framework. Als u langdurige bewerkingen moet uitvoeren, wordt het gelijktijdige pakket aanbevolen.

Algemene Overwegingen

AsyncTask wordt gedefinieerd door drie generieke typen: Params, Progress en Results. Vanaf het moment dat het wordt uitgevoerd, doorloopt het 4 stappen (methoden). De eerste is onPreExecute , waar iemand een laaddialoog kan definiëren, of een UI-bericht dat de gebruiker kan informeren dat de uitvoering gaat beginnen. Vervolgens doInBackground , de methode die asynchroon wordt uitgevoerd op een andere thread dan de Ui-thread. De derde methode is onProgressUpdate die ook kan worden uitgevoerd op de UI-thread die de gebruiker op de hoogte kan brengen van de status. De laatste methode die het heet, is onPostExecute en wordt voornamelijk gebruikt voor het publiceren van de resultaten.

Hieronder staat een voorbeeld van het gebruik van een AsyncTask, waarbij een string wordt geretourneerd.
voorbeeld 1

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (FloatingActionButton) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                executeAsyncTaskOperation();
            }
        });
    }


      private void executeAsyncTaskOperation() {
        new CustomAsyncTask(this).execute();
    }

    private static class CustomAsyncTask extends AsyncTask<Void, Void, String> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected String doInBackground(Void... params) {
            String object = null;
            try {
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                Thread.sleep(500);
                //bject = "new object";
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                object = null;
            }
            return object;
        }

        @Override
        protected void onPostExecute(String s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null) {
                Toast.makeText(context, "finished successfully!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}
 

Voorbeeld 2

Hier is de AsyncTask een beetje anders, de uitvoeringsmethode ontvangt een lijst met gegevens die op de achtergrond moeten worden geanalyseerd. Het retourresultaat is afhankelijk van deze controle.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();

                executeAsyncTaskOperation();
            }
        });
    }


    private void executeAsyncTaskOperation() {
        Boolean[] bools = new Boolean[10];
        for (int k = 0; k < 10; k++) {
            if (k % 2 == 0) {
                bools[k] = true;
            } else {
                bools[k] = false;
            }
        }
        new CustomAsyncTask(this).execute(bools);
    }

    private static class CustomAsyncTask extends AsyncTask<Boolean, Void, Integer> {

        private Context context;
        private ProgressDialog progressDialog;

        public CustomAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
        }

        @Override
        protected Integer doInBackground(Boolean... params) {
            int count = 0;
            try {
                Thread.sleep(1000);
                Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
                for (Boolean param : params) {
                    if (param) {
                        count++;
                    }
                }
            } catch (Exception exc) {
                Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
                count = 0;
            }
            return count;
        }

        @Override
        protected void onPostExecute(Integer s) {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            if (s != null && s > 0) {
                Toast.makeText(context, "finished loading: " + s + " tasks", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();

            }
        }
    }
}