Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

  • ¿Cuál es el significado de la palabra ImageView.ScaleType = "MATRIX"?
  • Android Utilice el botón Listo en Teclado para hacer clic en el botón
  • ¿Se está destruyendo la actividad porque la orientación ha cambiado o porque la aplicación se está cerrando?
  • Android: ¿Cómo puedo imprimir una variable en la consola eclipse?
  • CardView layout_width = "match_parent" no coincide con el ancho de RecyclerView padre
  • .NET Framework en Android
  • Cualquier experto de Android sabe alguna razón buena / error oscuro que podría causar por qué esto no se ha hecho?

  • Android Espresso Pruebas para teléfono y tableta
  • Cambiar el color de fondo de CardView mediante programación
  • Cómo eliminar el diálogo Alert Barra de título
  • ¿Cómo referenciar los atributos de estilo de un drawable?
  • Android: Algo mejor que android: ellipsize = "end" para agregar "..." a cadenas largas truncadas?
  • Poner espacio entre los botones de Android
  • 3 Solutions collect form web for “¿Cómo es que Android AsyncTask no implementa el futuro?”

    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 .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.