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

  • ¿Cómo un hilo creado por una aplicación se consideraría una aplicación diferente de ContentProvider de la aplicación?
  • Android XML redondeado esquinas recortadas
  • Recarga de la vista previa de la cámara Android y registro de vídeo mediarecorder
  • Android Studio: No se pudo encontrar: 'com.android.support:support-v4:19.1.0'
  • Reemplazar fragmento en ViewPager muestra pantalla en blanco?
  • Añadir flecha de herramientas a DialogFragment
  • Cualquier experto de Android sabe alguna razón buena / error oscuro que podría causar por qué esto no se ha hecho?

  • Pantalla Splash mientras carga recursos en la aplicación android
  • ¿Cómo comprobar si el fragmento existe?
  • Android: TextInputLayout esconde drawableRight de un niño EditText
  • Acceso a Android Wear Fit Data
  • Estructura de Directorio de Android Maven
  • ¿Cuál es el mejor protocolo de comunicación de cliente de servidor para usar en Android e iOS?
  • 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.