Looking for android-asynctask Answers? Try Ask4KnowledgeBase
Looking for android-asynctask Keywords? Try Ask4Keywords

android-asynctaskKomma igång med android-asynktask


Anmärkningar

Det här avsnittet ger en översikt över vad android-asynctask är och varför en utvecklare kanske vill använda den.

Det bör också nämna alla stora ämnen inom android-asynktask och koppla till relaterade ämnen. Eftersom dokumentationen för Android-asynctask är ny, kan du behöva skapa initialversioner av relaterade ämnen.

AsyncTask från koncept till implementering

Begrepp

AsyncTask är en klass som gör det möjligt att köra operationer i bakgrunden, med resultaten som publiceras på UI-tråden. Huvudsyftet är att eliminera all pannplåtkod för start / körning av en tråd genom att eliminera hanterarna och allt det som behövs för att manipulera trådarna. Syftet med AsyncTask är också att ha kortvariga operationer på en bakgrundstråd (högst några sekunder), inte längre tid. Därför är det viktigt att AsyncTask inte förväxlas med en generisk gängram. Om man behöver göra långtidsåtgärder rekommenderas det samtidiga paketet.

Allmänna överväganden

AsyncTask definieras av tre generiska typer: Params, Progress och Results. Från det ögonblick det körs går det igenom fyra steg (metoder). Först är onPreExecute , där någon kan definiera en laddningsdialog, eller något UI-meddelande som kan meddela användaren exekveringen är på väg att starta. Därefter, doInBackground, som är metoden som körs asynkront på en annan tråd än Ui-tråden. Den tredje metoden är onProgressUpdate som också kan köras på UI-tråden som kan meddela användaren om statusen. Den sista metoden som heter det är onPostExecute den används främst för att publicera resultaten.

Nedan följer ett exempel på hur du använder en AsyncTask, returnerar en sträng.
Exempel 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();

            }
        }
    }
}
 

Exempel 2

Här är AsyncTask lite annorlunda, exekveringsmetoden får en lista med data som ska analyseras i bakgrunden. Returresultatet beror på denna kontroll.

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

            }
        }
    }
}