我有一個列表,其中包含我想用Android的DownloadManager下載的圖像的URL。定義一個AsyncTask子類是一個非常基本的設計,它從列表中刪除一個對象,然後調用DownloadManager。我的問題是如何處理AsyncTasks的並行性時,每個將list.get(curentIndex)
。爲了把事情說清楚我想每一個任務(這將在並行因此運行他人之間不是隻有主線程的執行程序運行)來運行原子動作是使AsyncTasks自動運行
將刪除的對象列出
意志和增量索引
我有一個列表,其中包含我想用Android的DownloadManager下載的圖像的URL。定義一個AsyncTask子類是一個非常基本的設計,它從列表中刪除一個對象,然後調用DownloadManager。我的問題是如何處理AsyncTasks的並行性時,每個將list.get(curentIndex)
。爲了把事情說清楚我想每一個任務(這將在並行因此運行他人之間不是隻有主線程的執行程序運行)來運行原子動作是使AsyncTasks自動運行
將刪除的對象列出
意志和增量索引
這是一般的同步問題。有很多方法可以解決這個問題。我會提出一些建議:
// 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));
}
爲什麼不簡單地將AsyncTask的調用包裝在同步方法中,並使用適當的鎖定來使其基本上成爲原子? – Jitsu 2014-09-12 10:22:01
好吧,這是我想要的,但我不知道如何正確地做到這一點。我的意思是Java的明智我只使用AsyncTasks的並行而不是Java線程 – Libathos 2014-09-12 10:26:58