AsyncTask no funciona correctamente cuando se llama repetidamente desde un hilo

Estoy creando una aplicación que envía actualizaciones al servidor web cuando una canción comienza a reproducirse... Realizo la actualización del servidor web a través de asynctask, sin embargo, algunas veces se salta alguna información y se envían varias informaciones repetidamente. En algunos casos, asytask permanece en estado de ejecución, por lo que no se ejecuta después de eso. El hilo principal funciona bien.

Declaré la instancia así en MainActivity

    private static AsyncTask<Void, Void, Void> mTask = null;

el código para Asynctask es

private class SendingData extends AsyncTask<Void,Void,Void>{

        @Override
         protected void onPreExecute(){
            //some task              
         }         
        protected void onPostExecute(Void params){
            Log.d("Tesing","After Post");
            super.onPostExecute(params);         
            }
        @Override
        protected Void doInBackground(Void... arg0) {
            sendPost();
            return null;
        }

     }  

Mi llamada a asynctask cuando cambia una nueva canción en el hilo principal. Esta es una llamada repetitiva

 if(mTask.getStatus() == AsyncTask.Status.FINISHED){
                   // My AsyncTask is done and onPostExecute was called
                   Log.d("AsyncTask Status","Finished");
                  mTask = new SendingData();
                  mTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);

              }else if(mTask.getStatus() == AsyncTask.Status.PENDING){
                  Log.d("AsyncTask Status","Pending");
                  try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                  mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
              }

preguntado el 27 de noviembre de 13 a las 05:11

1 Respuestas

Declaraste tu AsyncTask como variable estática. Esto significa que sus referencias se confundirán, es decir, cuando comience una nueva AsyncTask, sobrescribirá la referencia anterior con una nueva.

respondido 27 nov., 13:05

¿Debo hacer una nueva referencia cada vez que encuentro o tengo que llamar a asynctask? ¿Cómo verifico el estado de la tarea asincrónica llamada anteriormente o simplemente llamo a una nueva sin pensar en la anterior como debajo de new SendingData().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); - Saty

¿Cuál es mejor AsyncTask.SERIAL_EXECUTOR o AsyncTask.THREAD_POOL_EXECUTOR para tareas repetitivas? Por favor explícame. - Saty

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.