IntentService y Threadpool

Tengo un IntentService que debe actuar como un administrador y crear Tareas en una cola (Runnable) que se envían a un ThreadPool.

Im un poco confundido del ciclo de vida de un IntentService:

El método protected abstract void onHandleIntent (Intent intent) ejecuta ya en un Thread separado. En el onHandleIntent crearía una nueva instancia Runnable y lo enviaría a ThreadPool. Mi servicio se ve así:

  public class SyncService extends IntentService { private final ThreadPoolExecutor threadPool; public SyncService() { super("SyncService"); BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); threadPool = new ThreadPoolExecutor(1, 1, 20, TimeUnit.SECONDS, queue); } @Override public void onCreate() { super.onCreate(); EventBus.getInstance().register(this); } @Override public void onDestroy() { super.onDestroy(); EventBus.getInstance().unregister(this); } @Override protected void onHandleIntent(Intent intent) { if (intent.getAction().equals("sync")){ threadPool.submit(new SyncRunnable()); }else if(intent.getAction().equals("delete")){ threadPool.submit(new DeleteRunnable()); } else if(intent.getAction().equals("register")){ threadPool.submit(new RegisterRunnable()) } } } 

Mis preguntas:

  1. ¿Es una buena idea usar un ThreadPool en un IntentService?
  2. Si utilizo un ThreadPool, que el IntentService será destruido si el Threadpool no tiene más Runnables para ejecutar o en cola, ¿verdad?
  3. ¿Es IntentService algo que quiero alcanzar y debo simplemente ejecutar mi código Runnable (largo) en el onHandleIntent() porque este método alread se ejecuta en el hilo de trabajo de IntentService? En caso afirmativo, ¿hay un límite de cola para la intención, ya que onHandleIntent () podría ejecutar hasta 30 segundos antes de terminar y manejar el próximo intento.

¿Es una buena idea usar un ThreadPool en un IntentService?

Realmente no. IntentService ya es una variante de serie única (serie) de lo que intenta lograr. Yo derivaría directamente del Service .

Si utilizo un ThreadPool, que el IntentService será destruido si el Threadpool no tiene más Runnables para ejecutar o en cola, ¿verdad?

No. IntentService puede entrar en el estado destruido una vez que regrese de onHandleIntent – es decir, inmediatamente porque threadPool.submit no bloquea. Dentro de la fuente llama a stopSelf(int) con el startId que obtuvo cuando se inició el servicio.

 private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } } 

Un Service entrará en estado destruido si llama a stopSelf con el último (más alto) startId. Seguirá funcionando si un comienzo más nuevo está en la cola.

Si el servicio entra en el estado destruido no va a matar a su grupo de hilos porque no tiene conocimiento sobre él. El problema es que Android ahora piensa que su servicio está muerto y ya no contará como una razón para mantener su proceso de aplicación. El servicio que funciona contra el estado destruido es esencialmente apenas una manera de decir a Androide que hay algo que va encendido y usted no desea conseguir destruido.

Si quieres hacerlo de la manera correcta tienes que mantener el estado del servicio en sincronía con lo que realmente está pasando.

¿Es IntentService algo que quiero alcanzar y debo simplemente ejecutar mi código Runnable (largo) en el onHandleIntent () porque este método alread se ejecuta en el hilo de trabajo de IntentService?

Si está satisfecho con la ejecución en serie de un solo hilo, sí. Eso es lo que onHandleIntent hace por usted.

En caso afirmativo, ¿hay un límite de cola para la intención, ya que onHandleIntent () podría ejecutar hasta 30 segundos antes de terminar y manejar el próximo intento.

No hay límite (es una lista vinculada por lo que puedo decir). Pero tampoco hay nada que le impida producir más tareas de las que puede manejar, lo que finalmente conducirá a algún tipo de desbordamiento.

  • Mejor manera de acceder a la base de datos en la aplicación multi-threaded Android?
  • Cómo crear tostadas de IntentService? Se queda atascado en la pantalla
  • android Espere entre actualizaciones de GridView
  • End SurfaceView y GameThread al salir de la aplicación
  • ¿Es seguro guardar una referencia a un hilo en un singleton?
  • Show Dialog in Juego con lienzo
  • Programación Android Camera.PreviewCallback (con OpenGL y OpenCV)
  • Suspender subprocesos al ejecutar múltiples AsyncTasks en fragmentos anidados y hace que la aplicación sea lenta
  • android esperando respuesta del servidor
  • ¿Por qué se filtran hilos en Android?
  • Android: Dos instancias de Media Recorder al mismo tiempo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.