Android Uso básico


Ejemplo

En Actividades y servicios de Android, la mayoría de las devoluciones de llamada se ejecutan en el hilo principal . Esto facilita la actualización de la interfaz de usuario, pero la ejecución de tareas pesadas de procesador o de E / S en el subproceso principal puede hacer que su interfaz de usuario se detenga y deje de responder ( documentación oficial sobre lo que sucede).

Puedes remediar esto poniendo estas tareas más pesadas en un hilo de fondo.

Una forma de hacerlo es usar una AsyncTask , que proporciona un marco para facilitar el uso de un subproceso en segundo plano, y también realizar tareas de subprocesos en la interfaz de usuario antes, durante y después de que el subproceso en segundo plano haya completado su trabajo.

Métodos que se pueden anular al extender AsyncTask :

  • onPreExecute() : invocado en el subproceso de la interfaz de usuario antes de que se ejecute la tarea
  • doInBackground() : se invoca en el subproceso en segundo plano inmediatamente después de que onPreExecute() termine de ejecutarse.
  • onProgressUpdate() : se invoca en el subproceso de la interfaz de usuario después de una llamada a publishProgress(Progress...) .
  • onPostExecute() : invocado en el subproceso de la interfaz de usuario después de que finalice el cálculo en segundo plano

Ejemplo

public class MyCustomAsyncTask extends AsyncTask<File, Void, String> {

    
    @Override
    protected void onPreExecute(){
        // This runs on the UI thread before the background thread executes.
        super.onPreExecute();
        // Do pre-thread tasks such as initializing variables. 
        Log.v("myBackgroundTask", "Starting Background Task");  
    }

    @Override
    protected String doInBackground(File... params) {
        // Disk-intensive work. This runs on a background thread.
        // Search through a file for the first line that contains "Hello", and return
        // that line.
        try (Scanner scanner = new Scanner(params[0])) {
            while (scanner.hasNextLine()) {
                final String line = scanner.nextLine();
                publishProgress(); // tell the UI thread we made progress

                if (line.contains("Hello")) {
                    return line;
                }
            }
            return null;
        }
    }

    @Override
    protected void onProgressUpdate(Void...p) {
        // Runs on the UI thread after publishProgress is invoked
        Log.v("Read another line!")
    }        

    @Override
    protected void onPostExecute(String s) {
        // This runs on the UI thread after complete execution of the doInBackground() method
        // This function receives result(String s) returned from the doInBackground() method.
        // Update UI with the found string.
        TextView view = (TextView) findViewById(R.id.found_string);
        if (s != null) {
            view.setText(s);
        } else {
            view.setText("Match not found.");
        }
    }

}

Uso:

MyCustomAsyncTask asyncTask = new MyCustomAsyncTask<File, Void, String>();
// Run the task with a user supplied filename.
asyncTask.execute(userSuppliedFilename);

o simplemente:

new MyCustomAsyncTask().execute(userSuppliedFilename);

Nota

Al definir una AsyncTask podemos pasar tres tipos entre corchetes < > .
Definido como <Params, Progress, Result> Parámetros <Params, Progress, Result> (vea la sección Parámetros )

En el ejemplo anterior, hemos utilizado los tipos <File, Void, String> :

AsyncTask<File, Void, String>
// Params has type File
// Progress has unused type
// Result has type String

Void se utiliza cuando desea marcar un tipo como no utilizado.

Tenga en cuenta que no puede pasar tipos primitivos (es decir, int , float y otros 6) como parámetros. En tales casos, debe pasar sus clases de envoltorio , por ejemplo, Integer lugar de int , o Float lugar de float .

El ciclo de vida de AsyncTask y Activity

AsyncTasks no sigue el ciclo de vida de las instancias de la actividad. Si inicia una AsyncTask dentro de una actividad y gira el dispositivo, la actividad se destruirá y se creará una nueva instancia. Pero la AsyncTask no morirá. Seguirá viviendo hasta que se complete.

Solución: AsyncTaskLoader

Una subclase de cargadores es el AsyncTaskLoader. Esta clase realiza la misma función que AsyncTask, pero mucho mejor. Puede manejar los cambios de configuración de la actividad más fácilmente, y se comporta dentro de los ciclos de vida de Fragmentos y Actividades. Lo bueno es que AsyncTaskLoader se puede usar en cualquier situación en la que se esté utilizando AsyncTask. En cualquier momento, los datos deben cargarse en la memoria para que la Actividad / Fragmento los maneje, AsyncTaskLoader puede hacer el trabajo mejor.