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:
- ¿Por qué mis hilos no mueren y causan una pérdida de memoria?
- Manejo de InterruptedException mientras espera una señal de salida (error en Android?)
- No se puede realizar la operación porque no hay ninguna transacción actual al insertar en la base de datos
- ¿Cómo obtener datos desde / hacia un socket en un hilo?
- java.lang.IllegalStateException: Llamar Ver métodos en otro subproceso que el subproceso de interfaz de usuario
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:
- ¿Es una buena idea usar un ThreadPool en un IntentService?
- Si utilizo un ThreadPool, que el IntentService será destruido si el Threadpool no tiene más Runnables para ejecutar o en cola, ¿verdad?
- ¿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.
- Tacto largo en una superficieView (android)
- Manera alternativa de subprocesos bajo Android
- Uso de la concurrencia de Android
- Pasar variables entre el renderizador y otra clase con queueEvent ()
- ¿Tiene soporte para Android?
- ¿Cómo se detiene un hilo sin un método stop ()?
- Android Instrumentación de Pruebas - UI Thread Issues
- Android cómo ejecutarOnUiThread en otra clase?
¿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.
- Vista de lista personalizada con el problema de la casilla de verificación
- Android – ¿cómo comprobar si la pantalla se está tocando?