¿Es posible usar AsyncTask en una clase de servicio?

Todo está en el título.

En las documentaciones oficiales se indica que los Note that services, like other application objects, run in the main thread of their hosting process y AsyncTask sólo funciona si se ejecuta en el UIThread.

Entonces, ¿es posible usar AsyncTask en una clase de servicio?

Estoy tratando de hacerlo, pero siempre estoy recibiendo el mismo error

 05-01 18:09:25.487: ERROR/JavaBinder(270): java.lang.ExceptionInInitializerError 

 05-01 18:09:25.487: ERROR/JavaBinder(270): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

¿Estoy haciendo algo malo o es simplemente imposible?

Aquí está el código de mi clase de servicio

 package com.eip.core; import android.app.Service; import android.content.Intent; import android.os.AsyncTask; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; public class NetworkService extends Service { private final INetwork.Stub mBinder = new INetwork.Stub() { @Override public int doConnect(String addr, int port) throws RemoteException { new ConnectTask().execute("test42"); return 0; } }; @Override public IBinder onBind(Intent arg0) { return mBinder; } private class ConnectTask extends AsyncTask<String, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); Log.i("OnPreExecute()", ""); } @Override protected Void doInBackground(String... arg0) { Log.i("doInBackground()", ""); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); Log.i("OnPostExecute()", ""); } } } 

También asegúrese de visitar IntentService. Si esa clase es suficiente para sus necesidades, se hará cargo de un montón de pequeños detalles involucrados en hacer que el patrón de trabajo correctamente.

Creo que encontré por qué no está funcionando en mi caso.

Aquí estoy usando esto:

 private final INetwork.Stub mBinder = new INetwork.Stub() { @Override public int doConnect(String addr, int port) throws RemoteException { new ConnectTask().execute("test42"); return 0; } }; 

Estoy utilizando esto para hacer lo que se llama IPC, Inter Process Communication , así que supongo que mi servicio y mi actividad están en dos procesos diferentes, AsyncTask debe ejecutarse en el hilo principal de la interfaz de usuario de acuerdo con el documento Android, así que ¿por qué estaba tratando Hacer me parece imposible de acuerdo con esos hechos.

Si estoy equivocado por favor alguien puede corregirme.

Tal vez el problema no es AsyncTask sino algo más. Por ejemplo, ¿está seguro de que su método onBind funciona correctamente? Por favor, pruebe esto:

 @Override public IBinder onBind(Intent arg0) { return null; } 

También puedes probar

 public class NetworkService extends Service{ @Override public void onStart(Intent intent, int startId) { new ConnectTask().execute("test42"); } } 

Aunque es posible utilizar AsyncTask en una clase de Service , esto viola las reglas de subprocesamiento , en particular, AsyncTask debe instanciarse e invocarse en el subproceso de interfaz de usuario. (Consulte https://stackoverflow.com/a/25172977/3664487 para más información.)

¿Es posible usar AsyncTask en una clase de servicio?

Sí. Ver Reto Meier (2010) Professional Android 2 Desarrollo de aplicaciones , Wrox. Meier ha publicado un código de soporte (véase / Capítulo 9 Terremoto 4 / src / com / paad / earthquake / EarthquakeService.java):

 public class EarthquakeService extends Service { ... private EarthquakeLookupTask lastLookup = null; ... private class EarthquakeLookupTask extends AsyncTask<Void, Quake, Void> { ... } @Override public int onStartCommand(Intent intent, int flags, int startId) { ... refreshEarthquakes(); return Service.START_NOT_STICKY; }; private void refreshEarthquakes() { ... lastLookup = new EarthquakeLookupTask(); lastLookup.execute((Void[])null); ... } } 

De un lado, no puedo encontrar ninguna evidencia para apoyar su afirmación de que " AsyncTask sólo funciona si se ejecuta en el UIThread " (aunque esto violaría las reglas de subprocesos ).

  • No se muestra la vista de Android después del método addView
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () 3
  • Diferencia entre Handler.post (Runnable r) y Activity.runOnUiThread (Runnable r)
  • ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
  • DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
  • IU de Android: ¿cuándo puedo modificar directamente una vista?
  • Animación de una vista mientras que ListView no está funcionando
  • Android ViewPager cambia automáticamente la página
  • ¿Cómo ejecutar algún código en el asíncrono de la interfaz de usuario de Android?
  • Android - SQLite ContentResolver insertar / eliminar / actualizar en UI Thread?
  • ¿Qué es el UiThread de Android (subproceso de interfaz de usuario)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.