¿Cómo es que Android AsyncTask no implementa el futuro?
En Java, me he acostumbrado a trabajar con Futures
. Ahora estoy mirando Android, y AsyncTask
implementa casi todos los mismos métodos y cubre ciclos de vida similares. Pero, si quiero ser consistente y utilizar el futuro en todo mi código, tengo que envolver AsyncTask en un envoltorio estúpido, porque no realmente implementar el futuro.
Todo lo que necesitan agregar es un método isDone()
, que parece que sería trivial, a continuación, agregar implements Future<Result>
. (Agregado más adelante: vea mi respuesta abajo para apenas cómo trivial sería).
- Java No se puede crear el controlador dentro del subproceso que no ha llamado Looper.prepare ()
- Cancelar una conexión en curso cuando el usuario presiona de nuevo
- LinearLayout llenado de derecha a izquierda
- Desbloquear el servicio externo android Paho MQTT ServiceConnectionLeaked error
- Android Convertir hora central a hora local
Cualquier experto de Android sabe alguna razón buena / error oscuro que podría causar por qué esto no se ha hecho?
- Tela que intenta utilizar un mapa de bits reciclado
- Cómo utilizar los servicios de juegos de Google Play con LibGdx
- Desconcertado por el valor de píxeles en Bitmap (pre multiplicado usando setPixel)
- ¿Cómo puedo configurar el color del trazo de la barra de calificación de Android? (No el color de las estrellas pero la FRONTERA)
- La conexión a LocalHost / 10.0.2.2 de Android Emulator ha caducado
- Barra de estado transparente: antes de Android 4.4 (KitKat)
- Creación de una biblioteca java con Eclipse
- Cómo analizar correctamente la API de Reddit en Android
Todavía estoy interesado en las razones teóricas "por qué" no utilizar AsyncTask para un futuro.
Pero, para el registro, terminé creando mi propia clase pequeña (demostrado abajo). Simplemente extiéndala en lugar de AsyncTask si quieres un futuro. IMO, una manera más limpia que la idea @ Eng.Fouad de acceder al mFuture privado dentro del código. (Pero gracias por la idea, me hizo mirar en el código fuente un poco!) YMMV.
public abstract class FutureAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> implements Future<Result>{ @Override public boolean isDone() { return AsyncTask.Status.FINISHED == getStatus(); } }
De la lectura del código real de AsyncTask.java
que en realidad utiliza una tarea de Future
y, a continuación, algunos más. Un Future
es una tarea que se ejecuta asíncronamente en cualquier lugar. Un AsyncTask
está programado en una cola para un único (o grupo de) subproceso (s) de fondo.
Un AsyncTask
es en realidad más "superior" que una tarea de Future
. Hace planificaciones y optimizaciones de lujo sobre la funcionalidad de Future
. Basta con mirar los niveles de introducción de la API. Future
se introdujo desde el principio API 1.0. El objeto AsyncTask
se introdujo en la API 3.
Un AsyncTask tiene una tarea futura, no es un futuro.
AsyncTask.java
/** * Creates a new asynchronous task. This constructor must be invoked on the UI thread. */ public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked return postResult(doInBackground(mParams)); } }; mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { try { postResultIfNotInvoked(get()); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing doInBackground()", e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); } } }; }
AsyncTask
es demasiado simple. Está destinado a tareas cortas que pueden tardar unos segundos, pero para las que no desea bloquear el subproceso de interfaz de usuario. Si realmente necesita un Future
, su tarea es probablemente demasiado compleja para una AsyncTask
todos modos.
Puede comprobar el estado de un AsyncTask
llamando a getStatus()
. Esto devolverá un enum que puede ser uno de Status.PENDING
, Status.RUNNING
o Status.FINISHED
.
- ¿Cómo obtener la vista de un elemento en listview en android?
- Token de acceso a Facebook siempre nulo