2014-09-12 2 views
0

У меня есть список, содержащий URL-адреса изображений, которые я хочу загрузить с помощью DownloadManager от Android. Это довольно простой дизайн для определения подкласса AsyncTask, который удаляет объект из списка, а затем вызывает DownloadManager. Моя проблема заключается в том, как обрабатывать параллелизм AsyncTasks, когда каждый из них будет list.get(curentIndex). Для того, чтобы сделать вещи ясно, что я хочу каждую задачу (которая будет работать на Исполнителю так работает параллельно среди других не только главный), чтобы запустить атомарно действие,Выполнение автоматического запуска AsyncTasks

  1. удалит объекты из списки

  2. волю и увеличиваем индекс

+0

Почему бы просто не обернуть вызов AsyncTask синхронизированным методом с помощью правильных блокировок, чтобы сделать его по существу атомарным? – Jitsu

+0

хорошо, что я хочу на самом деле, но я не знаю, как это сделать должным образом. Я имею в виду Java-мудрый Я только использовал AsyncTasks для параллелизма, а не для java-потоков – Libathos

ответ

1

Это в общем виде проблемы синхронизации. Есть много способов решить эту проблему. Я бы предложил что-то по строкам:

// Your index. Defaulted at 0. Thread safe Integer wrapper object. 
// All set/get operations are guaranteed atomical. 
AtomicInteger mIndex = new AtomicInteger(0); 

// Your list. This is thread-safe. All mutative operations 
// are atomical, and properly locked. The list is copied on each write. 
// This solution, though it does what it needs to do, is SLOW. Don't use for 
// large lists. 
CopyOnWriteArrayList<Object> mList = ... ; 

// Your async task. Maybe more of them. 
AsyncTask mTask = ...; 

// Anything here that should be thread safe. 
ensurePrerequisites(mTask); 

// Execute on thread pool to make sure they're parallel. 
// CAUTION: You will still get only (CPU_CORE_COUNT + 1) max parallel tasks. 
mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 


public void synchronized ensurePrerequisites(AsyncTask task) { 
    // I assume you want to pass the values into the task. 
    int idx = mIndex.getAndIncrement(); 
    task.setIndex(idx); 
    task.setObject(mList.remove(idx)); 
} 
+1

Большое спасибо за хорошо документированный ответ, который действительно помогает мне начать и продолжать самостоятельно. Я очень благодарен! – Libathos

+0

Я полагаю, что mList.remove (idx) - это mList.get (idx)? – Libathos

+0

Удаляет, по существу, удаляет элемент из списка и возвращает его. Точно так же, как get, просто он дополнительно удаляет элемент постоянно – Jitsu

Смежные вопросы