Implementación de IntentService usando LinkedBlockingQueue?

Estoy intentando descargar varios archivos usando IntentService. El IntentService no los carga como se espera uno a la vez, el único problema es que cuando el Internet está abajo el servicio de la intención no parará el donwload algo que conseguirá pegado en el hilo actual. Si logro detener el subproceso actual, seguirá ejecutando los otros subprocesos almacenados en su cola aunque la conexión a Internet esté desactivada.

Se sugirió en otro puesto que utilizo LinkedBlockingQueue y crear mi propio subproceso Worker que comprueba constantemente esta cola para nuevos subprocesos. Ahora sé que hay un aumento de los gastos generales y, por tanto, problemas de rendimiento al crear y destruir subprocesos, pero eso no es una preocupación en mi caso.

En este punto, lo único que quiero hacer es entender cómo funciona IntentService que aún no lo he hecho (y he mirado el código) y luego llegar a mi propia implementación para ello utilizando LinkedBlockingQueue controlado por un hilo Worker. Alguien ha hecho esto antes ? Podría proporcionar un ejemplo de trabajo, si usted se siente incómodo proporcionando el código fuente, pseudo código está bien por mí. ¡Gracias!

ACTUALIZACIÓN: Finalmente implementé mi propio servicio de intención usando un subproceso que tiene un looper que comprueba la cola que a su vez almacena las intenciones pasadas desde el startService (intención).

public class MyIntentService extends Service { private BlockingQueue<Download> queue = new LinkedBlockingQueue<Download>(); public MyIntentService(){ super(); } @Override public void onCreate() { super.onCreate(); new Thread(queueController).start(); Log.e("onCreate","onCreate is running again"); } boolean killed = false; Runnable queueController = new Runnable() { public void run() { while (true) { try { Download d =queue.take(); if (killed) { break; } else { d.downloadFile(); Log.e("QueueInfo","queue size: " + queue.size()); } } catch (InterruptedException e) { break; } } Log.e("queueController", "queueController has finished processing"); Log.e("QueueInfo","queue size: " + queue.toString()); } }; class Download { String name; //Download files process void downloadFile() { //Download code here } Log.e("Download","Download being processed is: " + name); } public void setName(String n){ name = n; } public String getName(){ return name; } } public void killService(){ killed = true; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Download d = new Download(); d.setName(intent.getStringExtra("VIDEOS")); queue.add(d); return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.e("stopSelf","stopSelf has been just called to stop the Service"); stopSelf(); } @Override public IBinder onBind(Intent intent) { return null; } } 

No estoy tan seguro acerca del START_NOT_STICKY en el método onStartCommand (). Si es la bandera derecha para regresar o no. ¡Cualquier aclaración sobre eso sería apreciada!

ACTUALIZACIÓN: Finalmente implementé mi propio servicio de intención utilizando un subproceso que tiene un looper que comprueba la cola que a su vez almacena las intenciones pasadas desde el startService (intención).

Public class MyIntentService extends Servicio {

 private BlockingQueue<Download> queue = new LinkedBlockingQueue<Download>(); public MyIntentService(){ super(); } @Override public void onCreate() { super.onCreate(); new Thread(queueController).start(); Log.e("onCreate","onCreate is running again"); } boolean killed = false; Runnable queueController = new Runnable() { public void run() { while (true) { try { Download d =queue.take(); if (killed) { break; } else { d.downloadFile(); Log.e("QueueInfo","queue size: " + queue.size()); } } catch (InterruptedException e) { break; } } Log.e("queueController", "queueController has finished processing"); Log.e("QueueInfo","queue size: " + queue.toString()); } }; class Download { String name; //Download files process void downloadFile() { //Download code here } Log.e("Download","Download being processed is: " + name); } public void setName(String n){ name = n; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.