Pregunta

Tengo una actividad ("ApplicationActivity") que llame a un servicio de intención ("Descargar el servicio")

Los archivos de descarga de Intentservice de Internet en segundo plano, pero quiero poder abortar una descarga específica .........

Entonces, digamos que puse 5 archivos en la cola: archivo 1,2,3,4,5

El servicio de intención comienza a descargar el número 1, luego el segundo y así sucesivamente ... 1) es una manera de decir que el servicio de intención aborta lo que está haciendo en este momento en el evento de manejo del método (en este caso descarga el archivo 1) ¿Y comenzar a descargar el siguiente?

2) ¿Es posible eliminar el elemento de la cola, por ejemplo, por ejemplo, mientras descarga el archivo 1, elimine el archivo 4 de la cola para que después del número 3 vaya directamente al 5?

En breve, necesito una forma de comunicarme con la cola para realizar estas 2 operaciones simples, pero no encontré nada útil en Internet :(

TNX

¿Fue útil?

Solución 2

Creo mi propia clase de MyIntentService copiando la original que es bastante corta y modificando métodos para mi propio propósito ... en particular para despojar un elemento, puede usar métodos de servicio en mi caso.
MserviceHandler.RemoVemessages (APPID);
que eliminan cualquier publicación pendiente de mensajes con un determinado código 'qué' que hay en la cola de mensajes, esto significa que debe etiquetar cada mensaje que agrega en la cola agregando un identificador dentro del campo "qué" de cada mensaje ... ..por ejemplo

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

Otros consejos

Gracias @user280560, encontré una solución basada en tu comentario :)

Solo para dar un ejemplo más específico, donde quería borrar la cola en ciertos casos.

Primero copié la fuente intentservice.java de aquí A mi proyecto (no es necesario cambiar los nombres, puede mantener IntentService.java, solo importe el suyo y no los de Android). Entonces agregué esto

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

a mi fuente de servicio.

Ahora, de mi servicio que extiende Intentservice, quería borrar la cola cuando se pasó una cierta acción (inicio de sesión) al servicio, por lo que anulé el OnStartMethod, así: así:

@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);
}

Funciona de maravilla :)

Espero que ayude a alguien ...

Extienda la clase IntentService y declare una lista para el elemento cancelado y siempre que desee cancelar algo, agregue a esta lista. ¡Finalmente antes de manejar su intención, asegúrese de que no haya sido cancelado!

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);
        }
    }
}

Sé que este código funciona porque lo probé antes, ¡pero no estoy seguro de que sea una forma correcta de hacerlo!

Puede vincularse al servicio IntentService y crear un método para cancelar o DESE UNA DESCARGA.

Aquí es un tutorial rápido lo que podría necesitar

Como dijo @JeffreyBlattman anterior, es mejor jugar a salvo asignando su propio "qué" valor al mensaje como este

@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);
    }

y despejar la cola como mServiceHandler.removeMessages(0).

Espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top