android-asynctaskRozpoczęcie pracy z android-asynctask


Uwagi

W tej sekcji omówiono, czym jest asynchroniczna platforma Android i dlaczego deweloper może chcieć z niej skorzystać.

Powinien również wymieniać wszelkie duże tematy w ramach asynchronicznego systemu Android i link do powiązanych tematów. Ponieważ Dokumentacja dla asynchronicznego systemu Android jest nowa, może być konieczne utworzenie początkowych wersji tych pokrewnych tematów.

AsyncTask od koncepcji do implementacji

Pojęcie

AsyncTask to klasa, która umożliwia uruchamianie operacji w tle, a wyniki są publikowane w wątku interfejsu użytkownika. Głównym celem jest wyeliminowanie całego kodu szablonu do uruchamiania / uruchamiania wątku poprzez wyeliminowanie programów obsługi i wszystkich rzeczy potrzebnych do manipulowania wątkami. Ponadto celem AsyncTask jest wykonywanie krótkotrwałych operacji na wątku w tle (najwyżej kilka sekund), a nie operacji długoterminowych. Dlatego ważne jest, aby AsyncTask nie mylić z ogólną strukturą wątków. Jeśli trzeba wykonywać operacje długoterminowe, zaleca się jednoczesny pakiet.

Uwagi ogólne

AsyncTask jest definiowany przez trzy ogólne typy: parametry, postęp i wyniki. Od momentu wykonania przechodzi przez 4 etapy (metody). Najpierw jest onPreExecute , gdzie ktoś może zdefiniować okno ładowania lub jakiś komunikat interfejsu użytkownika, który może powiadomić użytkownika, że wykonanie ma się rozpocząć. Następnie doInBackground, czyli metoda uruchamiana asynchronicznie w innym wątku niż wątek interfejsu użytkownika. Trzecią metodą jest onProgressUpdate, która może również działać w wątku interfejsu użytkownika, który może powiadamiać użytkownika o statusie. Ostatnia metoda o nazwie to onPostExecute służy głównie do publikowania wyników.

Poniżej znajduje się przykład użycia AsyncTask, zwracającego ciąg znaków.
Przykład 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();

            }
        }
    }
}
 

Przykład 2

W tym przypadku AsyncTask jest nieco inny, metoda wykonywania otrzymuje listę danych do analizy w tle. Wynik zwrotu zależy od tej kontroli.

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

            }
        }
    }
}