Async tarea no funciona correctamente (doInBackground no se ejecuta) cuando el servicio se ejecuta en segundo plano, Android

Me di cuenta de que a veces la tarea asíncrona no funciona correctamente, en realidad su método doInBackground () no se llama , esto sucede sobre todo cuando cualquier servicio se ejecuta en segundo plano para esa actividad. Por ejemplo, cuando la música se ejecuta en segundo plano con el servicio, la tarea Async no analiza XML en segundo plano como su doInBackground no funciona ese tiempo y el progreso Dialog o progressBar mantuvo girando.

He leído en pocos artículos que AsyncTask.THREAD_POOL_EXECUTOR puede ayudar en estos temas como:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) { new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { new Test().execute(); } 

Pero eso no ayudó en mi caso. Tener el mismo problema después de la implmentación anterior.

Aquí estoy dando sólo un poco de mi código de ejemplo para entender lo que estoy haciendo ::

 public class TestAct extends Activity { ImageButton play,forward,backward; private ListView mList; // many more variables @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_layout); //binding the service here // start service is called init(); } private void init(){ play=(ImageButton)findViewById(R.id.playBtn); forward=(ImageButton)findViewById(R.id.forward); backward=(ImageButton)findViewById(R.id.backward); mList=(ListView)findViewById(R.id.list); new GetData().execute(); play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // calling the play() method of ServiceConnection here } }); // adding header to Listview // other code and click listeners } class GetData extends AsyncTask<Void, Void, Void>{ @Override protected void onPreExecute() { super.onPreExecute(); // starting the progress Bar // initializing the Arraylist,Maps etc } @Override protected Void doInBackground(Void... params) { //parsing the XML here return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); // stop the ProgressBar // Updating my UI here // setting Adapter for ListView } } } 

Esto funciona bien generalmente, pero se bloquea cuando el servicio se ejecuta en backgound (quiero decir, cuando la música se reproduce en la parte posterior).

No estoy consiguiendo la razón exacta detrás de este problema de la tarea asíncrona. ¿Ayuda manual de la ejecución del hilo en este caso … ??

Bueno, creo que el problema es porque "El servicio se ejecuta en el hilo principal por lo que cuando se ejecuta, bloquea mi AsyncTask para ejecutar" … Así que creo que si podemos ejecutar el servicio en el hilo de fondo, entonces eso puede ayudar. Es por eso que he intentado IntentService para ejecutar el servicio en el hilo separado, pero estoy en duda … si IntentService puede ejecutarse por tiempo indefinido similar al servicio … y también IntentService bloques AsyncTask pocas veces. Así que no creo que su 100% soluciones perfectas para este tipo de problema.

¿Puede alguien ayudarme a solucionar este problema y entender el escenario completo.

Gracias por adelantado.

A veces necesitarás más control sobre el ciclo de vida de tu servicio que lo que IntentService te da, en esos casos solo puedes crear un hilo en el servicio y ejecutar tu código de fondo en eso. En realidad, para ser más específico, crear un HandlerThread que incluye un Looper para que pueda utilizar el método android estándar para la comunicación (mensajes) entre su hilo principal y el hilo de fondo.

Respondido aquí

Creo que el problema está comenzando otro GetData AsyncTask antes de que se haya terminado el anterior. Antes de ejecutar otra tarea asegúrese de que la anterior esté completa. Para ello, utilice el siguiente código:

 // make sure we don't collide with another pending AsyncTask if (getDataTask == null || getDataTask.getStatus() == AsyncTask.Status.FINISHED || getDataTask.isCancelled()) { getDataTask= new GetData(); getDataTask.execute(); } 

También asegúrese de tener una referencia para ejecutar tareas. Puede usar la subclase de la clase Application para hacer esto mientras la aplicación está ejecutando o anular onSaveInstanceState(Bundle outState) y recibir una referencia a ella en onCreate(Bundle savedInstanceState) .

Lea todo el problema y las respuestas que se han publicado aquí. Corregirme si estoy equivocado su escenario es que está analizando el xml y obtener la lista de canciones y cuando el usuario seleccione cualquier canción que desea que se juega con el derecho de servicio?

Si el escenario es correcto entonces podemos implementarlo de la manera mucho más sencilla.

  1. En el método Activity, onResume() analiza el archivo XML y obtiene la lista de canciones y actualiza la vista de lista (no inicie nada relacionado con el servicio aquí)
  2. Cuando el usuario haga clic en la canción luego pasar la clave / cadena particular al servicio con la intención y comenzar el servicio
  3. En el método OnStartCommand() del servicio obtenga el identificador e inicie la canción como con las API de medios normales

Eso realmente hará el trabajo para usted.

En cuanto al problema de

 if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) { new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { new Test().execute(); } 

Esto es para el comportamiento diferente de la AsyncTask en diferentes versiones de Android. Mirando su código lo que se está haciendo es en la actividad que está inicializando el servicio de ahí que el servicio se está ejecutando en el fondo sin hacer nada fructífero. Y cuando el usuario haga clic en el juego que está llamando función de juego de servicio que creó problme aquí.

Por lo que para llamar a la función de servicio de la actividad que debe AIDL derecho que usted no ha mencionado. Y si usted ha escrito así que debe ser perfecto.

Pero aquí la recomendación es pasar el id de la canción al servicio y debe jugar del servicio no debe llamar a la función del servicio en la actividad.

Si desea actualizar la lista de canciones en el valor de la actividad, debe escribir AIDL y llevar a cabo el escenario

Espero que esto ayude.

Me di cuenta de que a veces Async tarea no funciona correctamente, En realidad su método doInBackground () no se llama, esto sucede sobre todo

¿Sabes que hay un límite de AsyncTasks que se puede ejecutar a la vez? Tenía una vez un problema donde una tarea no comenzó / trabajo correctamente y esto era porque excedí ese número. Comprobar los límites de los hilos de Android AsyncTask? Para más sobre ese tema.

Cuando cualquier servicio se ejecuta en segundo plano para esa actividad. Por ejemplo, cuando la música se ejecuta en segundo plano con el servicio, la tarea Async no analiza XML en segundo plano como su doInBackground no funciona ese tiempo y el progreso Dialog o progressBar mantuvo girando.

¿Ha comprobado las posibilidades de bloqueos muertos (en particular, si está utilizando wait() y notify() )?

Bueno, creo que el problema es porque "El servicio se ejecuta en el hilo principal por lo que cuando se ejecuta, bloquea mi AsyncTask para ejecutar" … Así que creo que si podemos ejecutar el servicio en el hilo de fondo, entonces eso puede ayudar. Por eso yo

Las cosas que vas a hacer en un servicio debe funcionar en un propio hilo de todos modos. De esta manera usted puede estar seguro de que nada va a ser bloqueado. Si usted tiene algo para poblar usted podría utilizar un receptor, por ejemplo.

Espero poder ayudar un poco …

Aquí está una pista, ¿Cómo finalmente resolvió mi problema ::

1) He utilizado IntentService en lugar de Service as Service se ejecuta en mainThread mientras IntentService se ejecuta en un Thread separado de mainThread para asegurarse de que mi servicio de fondo no afecta a mi tarea actual. También, estoy usando AIDL para la comunicación entre mi interfaz de usuario y el hilo de fondo (esto ya estaba trabajando para el servicio, por lo que nada nuevo en esta parte).

2) He utilizado hilo sin dolor en lugar de AsyncTask , interrumpo el hilo en el método onDestroy () para asegurarse de que el hilo continúa indefinidamente.

La aplicación parece funcionar mucho mejor que anteriormente.

Espero que esto ayude a otros también 🙂

De acuerdo con la sección Reglas de subprocesamiento del documento AsyncTask de Android Developer, el AsyncTask debe crearse y iniciarse en el subproceso de la interfaz de usuario, por lo que si lo está iniciando desde un subproceso de fondo de un servicio, esto explicaría el comportamiento defectuoso.

http://developer.android.com/reference/android/os/AsyncTask.html

Realmente no debería estar usando AsyncTasks en general 🙂 Hay una explicación bastante buena aquí . Piense en lo que sucederá si el usuario gira el dispositivo mientras su tarea se está ejecutando. La actividad se vuelve a crear, pero la tarea se ejecuta en segundo plano y contiene una referencia a la actividad "antigua". Hay maneras de conseguir alrededor de esto, y son seguramente todavía algunos casos donde un AsyncTasks es el enfoque correcto.

Sin embargo, tu realmente debería considerar cambiar a un cargador o (si te sientes aventurero) prueba RoboSpice 🙂

  • ¿Se puede anidar un servicio en una aplicación?
  • Android bindservice
  • Permiso denegado cuando intento iniciarServicio
  • IntentService no se está llamando
  • Android: estado de la aplicación cuando la aplicación está fuera de pila debido a limitación de memoria
  • Mantener el servicio de fondo vivo después de la aplicación de salida del usuario
  • Temporizador Se ralentiza en Servicio cuando se bloquea la pantalla del dispositivo
  • AccessibilityService se destruye cuando se ejecuta uiautomator
  • Android escucha los mensajes del socket del servidor
  • Inicio del cuadro de diálogo del servicio
  • Android: mantener vivo un servicio de fondo (prevenir la muerte del proceso)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.