2011-09-06 14 views
15

ho un'attività ("ApplicationActivity"), che chiama un servizio di intenti ("DownloadService")Android: intentservice, come interrompere o saltare un compito in coda handleintent

I file intentService di download da internet a fondo, ma voglio essere in grado di interrompere un download specifico .........

Quindi diciamo che ho messo 5 file nella coda: di file 1,2,3,4,5

L'intento servizio inizia a scaricare il numero 1, quindi il secondo e così via .... 1) C'è un modo per dire al servizio di proposizione di interrompere ciò che stai facendo in questo momento nel metodo gestire l'evento (in questo caso il download del file 1) e avviare il download del prossimo?

2) È possibile rimuovere l'elemento dalla coda, quindi ad esempio mentre sta scaricando il file 1, rimuovere il file 4 dalla coda in modo che dopo il numero 3 passi direttamente al 5?

Poco, ho bisogno di un modo per comunicare con la coda per eseguire queste 2 operazioni semplici, ma non ho trovato nulla di utile su internet :(

Tnx

+0

Anche ora voglio la stessa cosa, il problema è risolto? –

risposta

12

creo il mio proprio codice categoria MyIntentService la copia di quello originale che è piuttosto breve e modificare metodi per il mio scopo ........ in particolare per dequare un elemento è possibile utilizzare i metodi di ServiceHandler nel mio caso
mServiceHandler.removeMessages (appId);
che rimuove qualsiasi messaggio in sospeso di messaggi con un determinato codice "cosa" presente nella coda messaggi, ciò significa che è necessario etichettare ogni messaggio aggiunto in coda aggiungendo un identificativo all'interno del campo "cosa" di ciascun messaggio. .... per esempio

public void onStart(Intent intent, int startId) 
{ 
    super.onStart(intent, startId); 
    Message msg = mServiceHandler.obtainMessage(); 
    msg.arg1 = startId; 
    msg.obj = intent; 
    msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside 
+0

puoi pubblicare il codice completo per la mia comprensione. –

1

È possibile associare al intentservice e creare un metodo per cancellare o de queu un download.

Here un breve tutorial di quello che si potrebbe aver bisogno

+0

ho letto velocemente il tuorial ma non riesco a capire come possa essere utile nel mio caso ..... è per servizi e servizi non intenti ....... e per un altro scopo .... ... il mio problema è che l'intento classe di servizio non fornisce alcun metodo per comporre con la coda ... l'unica cosa che posso pensare è copiare e incollare la classe intentService e modificarla .... – Sgotenks

+0

ciao. intentservice è la classe base di un servizio. Puoi ancora fare un legame. Il legame è lì per interagire con il servizio. Quindi in bind puoi avere un metodo stopcurrent o anche dequeu che imposta alcuni flag o rimuovi un file se hai un oggetto queue. – Pintac

19

Grazie @ user280560, ho trovato una soluzione basata su un commento :)

solo per dare un esempio più specifico, dove volevo cancellare la coda in certi casi.

Prima ho copiato il sorgente IntentService.java da here nel mio progetto (non è necessario cambiare i nomi, è possibile mantenere IntentService.java, basta importare i propri e non di Android). Quindi ho aggiunto questo

public void clearQueue() { 
    Debug.PrintInfo(TAG, "All requests removed from queue"); 
    mServiceHandler.removeMessages(0); 
} 

alla mia origine IntentService.

Ora, dal mio servizio che si estende IntentService, ho voluto cancellare la coda quando una certa azione (login) è stato passato al servizio, in modo da eseguire l'override del onStartMethod, in questo modo:

@Override 
public void onStart(Intent intent, int startId) { 
    if(intent.getAction().equals(ACTION_LOGIN)) { 
     //Login clears messages in the queue 
     clearQueue(); 
    } 
    super.onStart(intent, startId); 
} 

Opere come un fascino :)

speriamo vi sia utile a qualcuno ...

+1

Buon lavoro. Si ferma anche l'esecuzione delle operazioni o semplicemente interrompe le operazioni in coda? – vandzi

+0

Non penso che smetta di eseguire operazioni. Niente come testare però. Forse modificando un po 'di più la fonte originale IntentService si potrebbe ottenere ciò. –

+5

dovresti assegnare esplicitamente il campo 'what' nel messaggio invece di supporre che il suo valore sia 0.' what' non è usato nella fonte quindi dovrebbe essere sicuro usarlo per i tuoi scopi. –

4

estendere la classe IntentService e dichiarare una lista per un articolo annullato su di esso e ogni volta che si desidera annullare qualcosa aggiungeremo a questa lista. finalmente prima di maneggiare il tuo intento assicurati che non sia stato cancellato!

public class MyDownloadService extends IntentService { 
    private static List<String> canceledUrl; 

    public static void cancelDownload(String url){ 
     canceledUrl.add(url); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (intent != null) { 
      final String url = intent.getStringExtra(EXTRA_URL); 

      if(!canceledUrl.contains(url)) //if download has not been canceled already 
       downloadFile(url); 
      else 
       canceledUrl.remove(url); 
     } 
    } 
} 

So che questo codice funziona perché ho provato prima, ma non sono sicuro che sia un modo giusto per farlo!

+0

Questo non sta fermando i servizi già in esecuzione. Oltre a questo, questa è una soluzione buona e semplice. –

0

come detto da @JeffreyBlattman sopra, è meglio andare sul sicuro, assegnando il proprio "che cosa" valore al messaggio come questo

@Override 
    public void onStart(@Nullable Intent intent, int startId) { 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     msg.obj = intent; 
     msg.what = 0; 
     mServiceHandler.sendMessage(msg); 
    } 

e cancellare la coda come mServiceHandler.removeMessages(0).

Spero che questo aiuti.