Android: intentservice, как прервать или пропустить задачу в очереди в ручке

StackOverflow https://stackoverflow.com/questions/7318666

Вопрос

У меня есть деятельность («ApplicationActivity»), которая называется службой намерений («DownloadService»)

Загрузить файлы intentservice из Интернета в фоновом режиме, но я хочу иметь возможность прервать конкретную загрузку .........

Допустим, я поместил 5 файлов в очередь: файл 1,2,3,4,5

Служба намерения начинает загружать номер 1, затем второй и т. Д. ... 1) есть ли способ сказать службу намерения прервать то, что вы делаете в настоящее время в событии обработки методов (в данном случае загрузка файла 1) и начать загружать следующий?

2) Можно ли удалить элемент из очереди, поэтому, например, когда он загружает файл 1, удалите файл 4 из очереди, чтобы после номера 3 он перешел прямо на 5?

Вскоре мне нужен способ общаться с очередью, чтобы выполнить эти две простые операции, но я не нашел ничего полезного в Интернете :(

Tnx

Это было полезно?

Решение 2

Я создаю свой собственный класс myintentservice, копирующий оригинальный, который довольно короткий и модифицирующий методы для моей собственной цели ........, в частности, чтобы получить элемент, который вы можете использовать методы обслуживания в моем случае
mservicehandler.removemessages (appid);
Это удаляет любые ожидающие сообщения сообщений с определенным кодом «что», которые находятся в очереди сообщения, это означает, что вам нужно пометить каждое сообщение, которое вы добавляете в очередь, добавляя идентификатор в поле «Что» каждого сообщения ... ..Например

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

Другие советы

Спасибо @user280560, я нашел решение на основе вашего комментария :)

Просто чтобы привести более конкретный пример, где я хотел очистить очередь в определенных случаях.

Сначала я скопировал источник intentservice.java из здесь К моему проекту (не нужно менять имена, вы можете сохранить Intentservice.java, просто импортировать свою, а не Android). Затем я добавил это

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

к моему источнику услуги обслуживания.

Теперь, из моей службы, которая расширяет intentservice, я хотел очистить очередь, когда определенное действие (вход) было передано в службу, поэтому я переопределяю OnStartMethod, как это:

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

Работает как шарм :)

Надеюсь, это поможет кому -то ...

Расширить класс Intentservice и объявить список для отмененного элемента и всякий раз, когда вы хотите отменить что -то, добавьте его в этот список. Наконец, прежде чем обрабатывать свои намерения, убедитесь, что оно не было отменено!

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

Я знаю, что этот код работает, потому что я проверял его раньше, но я не уверен, что это правильный способ сделать это!

Вы можете привязаться к intentservice и создать метод для отмены или de Queu загрузкой.

Здесь это быстрое обучение, что вам может понадобиться

Как сказал @jeffreyblattman выше, лучше играть в безопасности, присвоив свое собственное «какое» значение для сообщения, подобного этому

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

и очистить очередь как mServiceHandler.removeMessages(0).

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top