2014-09-12 47 views
0

我有一個列表,其中包含我想用Android的DownloadManager下載的圖像的URL。定義一個AsyncTask子類是一個非常基本的設計,它從列表中刪除一個對象,然後調用DownloadManager。我的問題是如何處理AsyncTasks的並行性時,每個將list.get(curentIndex)。爲了把事情說清楚我想每一個任務(這將在並行因此運行他人之間不是隻有主線程的執行程序運行)來運行原子動作是使AsyncTasks自動運行

  1. 將刪除的對象列出

  2. 意志和增量索引

+0

爲什麼不簡單地將AsyncTask的調用包裝在同步方法中,並使用適當的鎖定來使其基本上成爲原子? – Jitsu 2014-09-12 10:22:01

+0

好吧,這是我想要的,但我不知道如何正確地做到這一點。我的意思是Java的明智我只使用AsyncTasks的並行而不是Java線程 – Libathos 2014-09-12 10:26:58

回答

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 2014-09-12 11:06:42

+0

我想那mList.remove(idx)是一個mList.get(idx)吧? – Libathos 2014-09-12 11:17:22

+0

Removes基本上從列表中刪除元素並將其返回。與get相同,只是它永久刪除元素 – Jitsu 2014-09-12 11:19:41