Frage

Ich habe eine Aktivität ("ApplicationActivity"), die einen Intent -Service ("DownloadService" anrufen).

Die Ab IntentService herunterladen Dateien vom Internet im Hintergrund, aber ich möchte einen bestimmten Download abbrechen .........

Nehmen wir also an, ich habe 5 Dateien in Warteschlangen einfügen: Datei 1,2,3,4,5

Der Intent Service beginnt, die Nummer 1, dann die zweite und so weiter herunterzuladen. 1) Gibt es eine Möglichkeit, dem Intent -Service zu sagen, was Sie derzeit im Methode -Handel -Ereignis tun (in diesem Fall Herunterladendatei 1) und fangen Sie an, den nächsten herunterzuladen?

2) Ist es möglich, Elemente aus der Warteschlange zu entfernen. Entfernen Sie beispielsweise die Datei 4 beispielsweise die Datei 4 aus der Warteschlange, so dass sie nach der Nummer 3 direkt zum 5 geht?

In Kürze brauche ich eine Möglichkeit, mich mit der Warteschlange zu verbinden, um diese 2 einfachen Vorgänge auszuführen, aber ich fand im Internet nichts Nützliches :(

Tnx

War es hilfreich?

Lösung 2

Ich erstelle meine eigene MyintentService -Klasse, die das Original kopiert, das ziemlich kurz ist und Methoden für meinen eigenen Zweck ändert ........ insbesondere, um ein Element zu dequeue
mserviceHandler.removemessages (Appid);
Dadurch werden anhängige Beiträge von Nachrichten mit einem bestimmten Code "Was" in der Nachrichtenwarteschlange angezeigt. Dies bedeutet, dass Sie jede Nachricht kennzeichnen müssen, die Sie in der Warteschlange hinzufügen, eine Kennung in das Feld "Was" jeder Nachricht hinzugefügt ... ..zum Beispiel

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

Andere Tipps

Danke @User280560, ich habe eine Lösung gefunden, die auf Ihrem Kommentar basiert :)

Nur um ein spezifischeres Beispiel zu geben, wo ich die Warteschlange in bestimmten Fällen löschen wollte.

Zuerst habe ich die IntentService.java -Quelle von kopiert hier Zu meinem Projekt (keine Namensnamen, können Sie IntentService.java beibehalten, einfach Ihre und nicht Ihre Androids importieren). Dann habe ich das hinzugefügt

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

Zu meiner Inventservice -Quelle.

Nun, von meinem Dienst, der Abs IntentService erweitert, wollte ich die Warteschlange löschen, wenn eine bestimmte Aktion (Anmeldung) an den Dienst übergeben wurde, daher überschreibe ich den OnStartMethod wie folgt:

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

Klappt wunderbar :)

Hoffe es hilft jemandem ...

Erweitern Sie die Ab IntenService -Klasse und deklarieren Sie eine Liste für storniertes Element darauf und wenn Sie etwas stornieren möchten, fügen Sie sie dieser Liste hinzu. Schließlich, bevor Sie Ihre Absicht bewältigen, stellen Sie sicher, dass es nicht abgesagt wurde!

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

Ich weiß, dass dieser Code funktioniert, weil ich ihn schon einmal getestet habe, aber ich bin mir nicht sicher, ob es ein richtiger Weg ist, es zu tun!

Sie können an den InventService binden und eine Methode erstellen, um einen Download zu stornieren oder zu de Queu.

Hier ist ein kurzes Tutorial, was Sie brauchen könnten

Wie von @jeffreyblattman oben erwähnt, ist es besser, sicher zu spielen, indem Sie Ihrem eigenen "Was" der Nachricht wie dieser zuweisen

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

und räumen Sie die Warteschlange wie mServiceHandler.removeMessages(0).

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top