package com.droidworks.http.download;
import java.util.HashSet;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.util.Log;
import com.droidworks.http.HttpUtils;
public class ConcurrentDownloadManager implements DownloadManager {
private final ThreadPoolExecutor mThreadPool;
private final DefaultHttpClient mClient;
// quick and dirty hack to tell us if an item has been q'd or not.
private final HashSet<String> mQueued
= new HashSet<String>();
public ConcurrentDownloadManager() {
mThreadPool = new ThreadPoolExecutor(3, 6, 10, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(),
new AndroidThreadFactory(
android.os.Process.THREAD_PRIORITY_LOWEST));
mClient = HttpUtils.getThreadSafeClient();
}
@Override
public void addDownloadTask(DownloadTask<?> task) {
mQueued.add(task.getUrl());
mThreadPool.submit(new TaskRunnable(task));
}
private class TaskRunnable implements Runnable {
private final DownloadTask<?> mTask;
public TaskRunnable(DownloadTask<?> task) {
mTask = task;
}
public void run() {
try {
HttpResponse response = mClient.execute(new HttpGet(mTask.getUrl()));
mTask.processStream(response.getEntity().getContent());
}
catch (Exception e) {
Log.e(getClass().getCanonicalName(), "Download Exception", e);
}
mQueued.remove(mTask.getUrl());
mTask.notifyListeners();
}
}
@Override
public void cancelAll() {
// shutdown the threadpool
mThreadPool.shutdownNow();
}
@Override
public int getThreadCount() {
return mThreadPool.getPoolSize();
}
@Override
public boolean isQueued(DownloadTask<?> task) {
return mQueued.contains(task.getUrl());
}
@Override
public void setMaxThreads(int count) {
mThreadPool.setMaximumPoolSize(count);
}
@Override
public void setPollingDuration(int seconds) {
// ignored
}
@Override
public void setTaskTimeout(int seconds) {
HttpUtils.setConnectionTimeout(mClient, seconds);
}
}