Android multihilo: AsyncTask entender y resumen de uso

A, AsyncTask Introducción

1.1 La función:

clase asíncrona ligero, mientras que es conveniente para el hilo hijo actualizado la interfaz de usuario.

1.2 Principio:

Se encapsula grupo de subprocesos Handler y dos. enlace de la fuente AsyncTask

  1. Subproceso del grupo de THREAD_POOL_EXECUTOR: por ThreadFactory y algunos parámetros de ejecutar el grupo de subprocesos THREAD_POOL_EXECUTORutilizado para realizar las tareas .
  2. Tema piscina SERIAL_EXECUTOR: clase interna SerialExecutor Ejecutor también implementar una instancia de objeto del grupo de subprocesos SERIAL_EXECUTORrealizar SerialExecutor definido executemanera de serie (uno por uno en orden) cola de tareas y el uso THREAD_POOL_EXECUTORpara realizar una tarea .
  3. Instancia un objeto WorkerRunnable AsyncTask crear mWorker y una FutureTask objetos mFuture . FutureTask es una clases concurrentes, actúan como el papel de Ejecutable. AsyncTask la aplicación de la cola de tareas del grupo de subprocesos SerialExecutor mFuture como execute(final Runnable r)el paso de parámetros y, a continuación, utilizará los subprocesos de trabajo de línea de serie para manejar la tarea real.
  4. mFuture objeto se crea la mWorker objeto como un argumento, en mFuture en una misión run()cuando las llamadas mWorker el call()método, por lo que call()el procedimiento se lleva a cabo en el grupo de subprocesos.
  5. El hilo conductor de Handler: Entonces call()método que a continuación llamadas result = doInBackground(mParams);y devuelve un resultado objetivo, el proceso fue cancelado tarea se pondrá al día fuera del extremo AsyncTask conjunto. call()El método finalmente postResult(result);obtener el controlador de rosca primaria mensajes enviar y actualizar la interfaz de usuario se determina de acuerdo con el tipo de mensaje o terminar AsyncTask.
    referencia específica: fuente de Android trabajos analíticos en el AsyncTask

1.3 Las funciones básicas y parámetros

AsyncTask es una clase genérica, en android.osel paquete

.png clase AsyncTask


El tipo genérico se define por tres parámetros que necesitamos datos, si no pasar parámetros, puede ser reemplazado por, los siguientes significados específicos Void:

 

  • Params : parámetros de tipo;
  • Progreso : el progreso de la implementación del tipo de tareas en segundo plano;
  • El Resultado : devuelve el resultado del tipo de tareas en segundo plano.
    AsyncTask también proporciona cuatro métodos básicos:
  1. protected void onPreExecute(): Antes de que el hilo principal para realizar tareas asincrónicas de llamada trabajos preparatorios;
  2. protected abstract Result doInBackground(Params... var1): Hilos de ejecución en la piscina, que se utiliza para realizar tareas asíncronas. Params representa los parámetros de entrada de tareas asíncronas, en este método por publishProgress al método de progreso de la tarea de actualización, publishProgress a su vez llama a la onProgressUpdate manera de lograr las principales actualizaciones de progreso hilo. Este método devuelve Resultado de onPostExecute método.
  3. protected void onProgressUpdate(Progress... values): En el hilo principal de la ejecución, una tarea de fondo cronograma de ejecución cambios llamar a este método.
  4. protected void onPostExecute(Result result): Después de la ejecución del hilo principal, tareas asíncronas llaman, el resultado parámetro se doInBackground regresó.

El orden de estos cuatro métodos se realiza: OnPreExecute (Preparación) -> doInBackground (de forma asíncrona en el fondo) -> onPostExecute (resultado de proceso) .
También hay un método útil: protected void onCancelled(): Cuando la llamada asincrónica para cancelar la misión, pero esta vez onPostExecute no puede ser llamado.

Dos, el uso AsyncTask

2,1 AsyncTask utiliza ejemplos:

(1) Actividad crear, la disposición de los dos botones para iniciar y cancelar la AsyncTask , un TextView para mostrar el estado.

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始下载"/>

    <Button
        android:id="@+id/btn_cancel"
        android:layout_below="@id/btn_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="取消下载"/>

    <TextView
        android:id="@+id/tv_statue"
        android:layout_below="@id/btn_cancel"
        android:textSize="15sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

(2) para crear una costumbre de clases interna MyAsyncTask hereda la AsyncTask , cuatro método de reescritura importante:

 

  //第一个参数:Params参数类型:String类型 
  //第二个参数:Progress执行进度类型:Object类型 
  //第三个参数:Result参数类型:Long类型
  private class MyAsyncTask extends AsyncTask<String,Object,Long>{
  ...
  @Override
  protected void onPreExecute() {...}

  @Override
  protected Long doInBackground(String... strings) {...}

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

   @Override
   protected void onPostExecute(Long aLong) {...}

  @Override //任务取消调用
  protected void onCancelled() {...}

(3) Iniciar llamada de botón crea MyAsyncTask y ejecutar downloadTask.execute(urls)los parámetros de entrada.

 

mDownButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String[] urls = {
                "http://www.jianshu.com/p/d3984e7e204f",
                "http://www.jianshu.com/p/8e3cfb87f35e",
                "http://www.jianshu.com/p/4fbc2ea2e02b"
        };
        downloadTask = new MyAsyncTask();
        // 这里的url也可以分成一个一个参数传递
        downloadTask.execute(urls);
    }
});

(4) Cancelar llamadas botón downloadTask.cancel(true)de parada MyAsyncTask.

 

//取消按钮点击事件
downloadTask.cancel(true);

(5) doInBackground(String... strings)El método de la ejecución de la tarea ciclos de descarga y devuelve resultado, su definición de una matriz de dos dimensiones, la primera es el número de bytes, el segundo es el título del artículo.

 

protected Long doInBackground(String... strings) {
    long totalByte = 0;
    for (String url:strings){
        // downloadFile方法只是一个简单的下载字节流
        // 返回的Object[] result是二维数组,一个是下载的字节数,一个是标题
        Object[] result = downloadFile(url);
        int byteCount = (int) result[0];
        totalByte += byteCount;
        //传递进度
        publishProgress(result);
        // 异步任务调用取消则跳出for循环
        if(isCancelled()){
            break;
        }
    }
    return totalByte;
}

(6) a continuación, publishProgress(result);los datos se pasan al onProgressUpdate(Object... values)método para actualizar la interfaz de usuario, este método se ha cambiado a la rosca principal, es posible actualizar la interfaz de usuario. Después de la finalización de AsyncTask onPostExecute(Long aLong)método se llama de nuevo automáticamente para actualizar el estado.

 

  @Override
  protected void onPostExecute(Long aLong) {...}

Mira los resultados, voy a estar detrás de la liberación del código fuente, cancele la descarga sus propias pruebas.

 

AsyncTaskDemo.gif

2.2 AsyncTask Precaución:

  1. clase AsyncTask debe ser cargado en el hilo principal.
  2. AsyncTask objetos se deben crear en el hilo principal.
  3. ejecutar el método debe ser llamado en el subproceso de interfaz de usuario.
  4. Un objeto AsyncTask sólo puede realizarse una vez , que sólo puede ser llamado una vez que el método de ejecución, de lo contrario el informe de excepción en tiempo de ejecución.
  5. Antes de la misión de serie Android1.6, AsyncTask, Android1.6 cuando AsyncTask comenzó a usar un mango tareas paralelas grupo de subprocesos, pero Android3.0 desde el principio, con el fin de evitar errores de concurrencia AsyncTask trajo, y el uso de un hilo AsyncTask La misión de serie. Sin embargo, en Android3.0 y versiones posteriores, todavía podemos AsyncTask de executeOnExecutor para realizar tareas en el método paralelo.

Tres, ventajas y desventajas AsyncTask

3.1 Ventajas:

  1. Sencilla y rápida y fácil de usar.
  2. La interfaz de usuario se actualiza en tiempo y forma, el control del proceso.

3.2 Desventajas:

Múltiples necesidades operación asincrónica para actualizarse interfaz de usuario, se vuelve problemático.

3.3 Otras cuestiones:

Artículo de referencia: defectos y problemas de AsyncTask

Catálogo de artículo:
Android multihilo: entender y utilizar el simple resumen

Reproducido: https://www.jianshu.com/p/de41c082f5c1

Publicado 49 artículos originales · ganado elogios 2 · Vistas 8589

Supongo que te gusta

Origin blog.csdn.net/yangjunjin/article/details/105029190
Recomendado
Clasificación