Domanda

Ho un'attività ( "ApplicationActivity"), che chiama un servizio di intenti ( "DownloadService")

I file intentService di download da internet in background, ma voglio essere in grado di interrompere una specifica scaricare .........

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

Il servizio intento avviare il download il numero 1, poi il secondo e così via .... 1) C'è un modo per dire al servizio intento interruzione quello che stai facendo in questo momento, in caso metodo di impugnatura (in questo file scaricano caso 1) e iniziare a scaricare la prossima?

2) E 'possibile rimuovere l'elemento dalla coda, quindi, ad esempio, mentre si lima 1 download, rimuovere il file 4 dalla coda in modo che dopo il numero 3 che va dritto al 5?

In breve, 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

È stato utile?

Soluzione 2

Creo il mio proprio codice categoria MyIntentService copia di quello originale che è piuttosto breve e la modifica di metodi per il mio scopo ........ in particolare per annullare l'accodamento di un elemento è possibile utilizzare i metodi di ServiceHandler nel mio caso
mServiceHandler.removeMessages (appId);
che Rimuovere eventuali messaggi in attesa di messaggi con un determinato codice 'cio' che si trovano nella coda di messaggi, questo significa che si deve etichettare ogni messaggio si aggiunge in coda l'aggiunta di un identificatore all'interno del "che cosa" campo di ogni 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

Altri suggerimenti

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

tanto per fare un esempio specifico di più, dove volevo cancellare la coda in certi casi.

Per prima cosa ho copiato la fonte IntentService.java da qui al mio progetto (non c'è bisogno di nomi cambiano, è possibile mantenere IntentService.java, solo tuo importazione e di non androide). Poi ho aggiunto questo

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

per la mia fonte 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 sovrascrivo l'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);
}

funziona come un fascino:)

La speranza che aiuta qualcuno ...

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. infine, prima di maneggiare il make intento sicuro che non è stato annullato!

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!

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

Qui è un breve tutorial ciò che si potrebbe aver bisogno

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

La speranza che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top