Estoy tratando de descargar varios archivos usando IntentService. IntentService los descarga okey como se esperaba de a uno por vez, el único problema es que cuando Internet está inactivo, el servicio intencionado no detendrá la descarga sino que se atascará en el hilo actual. Si consigo detener el hilo actual, continuará ejecutando los otros hilos almacenados en su cola, aunque la conexión a Internet esté inactiva.Implementación de IntentService utilizando LinkedBlockingQueue?
Se sugirió en otra publicación que uso LinkedBlockingQueue y creo mi propia cadena de trabajo que comprueba constantemente esta cola para nuevos subprocesos. Ahora sé que hay algunos gastos generales aumentados y, por lo tanto, problemas de rendimiento al crear y destruir subprocesos, pero eso no es una preocupación en mi caso.
En este punto, todo lo que quiero hacer es entender cómo funciona IntentService que aún no lo he hecho (y he analizado el código) y luego presentar mi propia implementación utilizando LinkedBlockingQueue controlado por un Hilo de trabajo. Alguien ha hecho esto antes ? Podría proporcionar un ejemplo de trabajo, si se siente incómodo al proporcionar el código fuente, el pseudo código está bien para mí. ¡Gracias!
ACTUALIZACIÓN: Finalmente implementé mi propio servicio de intención usando un hilo que tiene un looper que verifica la cola que a su vez almacena los intentos pasados desde el servicio de inicio (intento).
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 sobre el START_NOT_STICKY en el método onStartCommand(). Si es la bandera correcta para regresar o no. ¡Cualquier aclaración sobre eso sería apreciada!
Estoy pensando, en lugar de descargar todos estos archivos uno por uno, estoy pensando en comprimirlos y luego descargar el archivo zip de una vez y luego, cuando se descarga completado extraer los archivos en la tarjeta SD, ¿es esto posible? – bytebiscuit