Android: intentservice, как прервать или пропустить задачу в очереди в ручке
-
27-10-2019 - |
Вопрос
У меня есть деятельность («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)
.
Надеюсь, это поможет.