2011-11-04 9 views
7

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!

+0

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

Respuesta

0

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).

MyIntentService clase pública se extiende 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; 
     } 
Cuestiones relacionadas