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
- Subproceso del grupo de THREAD_POOL_EXECUTOR: por ThreadFactory y algunos parámetros de ejecutar el grupo de subprocesos
THREAD_POOL_EXECUTOR
utilizado para realizar las tareas . - Tema piscina SERIAL_EXECUTOR: clase interna SerialExecutor Ejecutor también implementar una instancia de objeto del grupo de subprocesos
SERIAL_EXECUTOR
realizar SerialExecutor definidoexecute
manera de serie (uno por uno en orden) cola de tareas y el usoTHREAD_POOL_EXECUTOR
para realizar una tarea . - 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. - mFuture objeto se crea la mWorker objeto como un argumento, en mFuture en una misión
run()
cuando las llamadas mWorker elcall()
método, por lo quecall()
el procedimiento se lleva a cabo en el grupo de subprocesos. - El hilo conductor de Handler: Entonces
call()
método que a continuación llamadasresult = 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 finalmentepostResult(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.os
el 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:
protected void onPreExecute()
: Antes de que el hilo principal para realizar tareas asincrónicas de llamada trabajos preparatorios;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.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.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:
- clase AsyncTask debe ser cargado en el hilo principal.
- AsyncTask objetos se deben crear en el hilo principal.
- ejecutar el método debe ser llamado en el subproceso de interfaz de usuario.
- 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.
- 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:
- Sencilla y rápida y fácil de usar.
- 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