¿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).

Cualquier experto de Android sabe alguna razón buena / error oscuro que podría causar por qué esto no se ha hecho?

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 .

  • AlertDialog con EditText con el correo electrónico InputType - Android
  • ¿Cómo usar com.android.databinding en el módulo (estudio de Android)?
  • Cómo llamar a la actividad nativa de la actividad java?
  • Cambiar el color del tema en Runtime en Android
  • Android: URLConnection.getContentLength () que da un valor incorrecto
  • Aplicación del tema AppCompat a las preferencias individuales en un archivo PreferenceFragment
  • Cómo usar onclicklistener para ver la cuadrícula
  • Atributo XML de la contraseña de Android: desaprobado
  • ¿Cuál es la diferencia entre usar add (). AddToBackStack (), add (). Detach () y replace (). AddToBackStack () en un FragmentTransaction?
  • Android redibujar diseño de forma programática
  • ¿Cómo puedo hacer mi proyecto de Android disponible desde el control remoto usando gradle como Picasso, Volley, etc?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.