Android: Implicación del uso de AsyncTask para realizar repetidas llamadas Ajax

Necesito que mi aplicación de Android recupere periódicamente datos de un servidor utilizando llamadas AJAX y actualice la interfaz de usuario en consecuencia (solo un montón deTextViews que necesitan actualizarse consetText()). Tenga en cuenta que esto implica 2 tareas:

Haciendo una llamada AJAX y actualizando la interfaz de usuario una vez que recibo una respuesta, uso una @ simpAsyncTask para esto Hacer lo anterior repetidamente, a intervalos regulares.

No he descubierto una forma elegante de alcanzar el punto 2 anterior. Actualmente, simplemente estoy ejecutando la tarea en sí desdeOnPostExecute(). Leo eneste hilo en SO que no necesito preocuparme por la recolección de basura en lo que respecta a los objetos AsyncTask.

Pero todavía no estoy seguro de cómo configuro un temporizador que disparará mi AsyncTask después de que caduque. Cualquier puntero será apreciado. Aquí está mi código:

public class MyActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new AjaxRequestTask().execute(MY_REST_API_URL);

    }

    private void updateReadings(String newReadings) {
           //Update the UI
        }

    class AjaxRequestTask extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... restApiUrl) {
                    //Do AJAX Request
                }

        @Override
        protected void onPostExecute(String result) {
            updateReadings(result);
                     /*Is there a more elegant way to achieve this than create a new AsyncTask object every 10 seconds?  Also, How can I update the UI if I create a timer here? */
            new AjaxRequestTask().execute(MY_REST_API_URL);
        }

    }

}

Gracias por adelantad

EDIT: intenté publicar una respuesta pero no pude hacerlo ya que no tengo la reputación de responder en 8 horas.

Bueno, entonces encontré una solución. Sin embargo, no estoy convencido.

protected void onPostExecute(String result) {

            updateReadings(result);
            // super.onPostExecute(result);
            new Timer().schedule(
                    new TimerTask() {
                        @Override
                        public void run() {
                            new AjaxRequestTask().execute(MY_REST_API_URL);
                        }
                    }, 
                    TIMER_ONE_TIME_EXECUTION_DELAY
            );
        }

¿Hay alguna otra cara que debería tener en cuenta cuando uso esto? En particular, estoy viendo muchos GC en el LogCat. Además, me pregunto cómo unAsyncTask puede ser candidato para GC a menos queonPostExecute() completa?

¿Cómo puedo "detener" las actualizaciones? Una forma en la que pensé fue hacer la primeraAsyncTask instancia como una variable miembro de laActivity. De esa manera, puedo invocar acancel(true) en él y espero que esto "pare" las tareas.

SOLUCIÓ:

En caso de que alguien esté buscando algo similar, ninguna de las soluciones que mencioné aquí funciona satisfactoriamente. Todos sufren deOutOfMemory cuestiones. No depuré los detalles de la OOM, pero sospecho que podría deberse a la recursión o a tener objetos relacionados con HTTP como variables miembro enAsyncTask en lugar de como miembros de laActivity (básicamente por NO reutilizar HTTP y otros objetos).

Descarté este enfoque por otro diferente, haciendo que mis llamadas Ajax fueran interminables en eldoInBackground() de miAsyncTask; y actualizando la IU enonProgressUpdate(). De esa manera también evito la sobrecarga de mantener demasiados hilos oHandlers para actualizar la interfaz de usuario (recuerde que la interfaz de usuario se puede actualizar enonProgressUpdate()).

ste enfoque también elimina la necesidad deTimers yTimerTasks, favoreciendo el uso deThread.sleep() en su lugar. @Este hilo en SO tiene más detalles y un fragmento de código también.

Respuestas a la pregunta(5)

Su respuesta a la pregunta