android 线程任务管理器 管理下载任务
1 public class DownloadTaskManagerThread implements Runnable { 2 3 private DownloadTaskManager downloadTaskManager; 4 5 // 创建一个可重用固定线程数的线程池 6 private ExecutorService pool; 7 // 线程池大小 8 private final int POOL_SIZE = 5; 9 // 轮询时间 10 private final int SLEEP_TIME = 1000; 11 // 是否停止 12 private boolean isStop = false; 13 14 public DownloadTaskManagerThread() { 15 downloadTaskManager = DownloadTaskManager.getInstance(); 16 pool = Executors.newFixedThreadPool(POOL_SIZE); 17 } 18 19 @Override 20 public void run() { 21 // TODO Auto-generated method stub 22 while (!isStop) { 23 DownloadTask downloadTask = downloadTaskManager.getDownloadTask(); 24 if (downloadTask != null) { 25 pool.execute(downloadTask); 26 27 } else { //如果当前未有downloadTask在任务队列中 28 try { 29 // 查询任务完成失败的,重新加载任务队列 30 // 轮询, 31 Thread.sleep(SLEEP_TIME); 32 } catch (InterruptedException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 } 37 } 38 if (isStop) { 39 pool.shutdown(); 40 } 41 42 } 43 44 /** 45 * @param isStop 46 * the isStop to set 47 */ 48 public void setStop(boolean isStop) { 49 this.isStop = isStop; 50 } 51 52 }
DownloadTaskManagerThread:下载任务管理器线程,对下载管理器中的任务链表进行逐个获取,进行任务执行。
DownloadTaskManager:下载管理器,对任务集中的管理,添加、移除操作。
1 public class DownloadTaskManager { 2 private static final String TAG="DownloadTaskManager"; 3 // UI请求队列 4 private LinkedList<DownloadTask> downloadTasks; 5 // 任务不能重复 6 private Set<String> taskIdSet; 7 8 private static DownloadTaskManager downloadTaskMananger; 9 10 private DownloadTaskManager() { 11 12 downloadTasks = new LinkedList<DownloadTask>(); 13 taskIdSet = new HashSet<String>(); 14 } 15 16 public static synchronized DownloadTaskManager getInstance() { 17 if (downloadTaskMananger == null) { 18 downloadTaskMananger = new DownloadTaskManager(); 19 } 20 return downloadTaskMananger; 21 } 22 23 //1.先执行 24 public void addDownloadTask(DownloadTask downloadTask) { 25 synchronized (downloadTasks) { 26 // 增加下载任务 27 downloadTasks.addLast(downloadTask); 28 System.out.println("下载管理器增加下载任务1个"); 29 } 30 } 31 32 public boolean isTaskRepeat(String fileId) { 33 synchronized (taskIdSet) { 34 if (taskIdSet.contains(fileId)) { 35 return true; 36 } else { 37 System.out.println("下载管理器增加下载任务:"+ fileId); 38 taskIdSet.add(fileId); 39 return false; 40 } 41 } 42 } 43 44 public DownloadTask getDownloadTask() { 45 synchronized (downloadTasks) { 46 if (downloadTasks.size() > 0) { 47 System.out.println("下载管理器增加下载任务:"+"取出任务"); 48 DownloadTask downloadTask = downloadTasks.poll(); 49 //taskIdSet.remove(downloadTask.getFileId()); 50 return downloadTask; 51 } 52 } 53 return null; 54 } 55 56 public void removeField(String position){ 57 taskIdSet.remove(position); 58 } 59 60 public int getDownloadTaskSize() 61 { 62 return downloadTasks.size(); 63 } 64 }
DownloadTask :单个的下载任务线程(具体的下载任务)
1 /** 2 * 任务执行线程 3 */ 4 public class DownloadTask extends Thread { 5 private Handler handler; 6 7 /** 8 * 初始化下载任务 9 */ 10 public DownloadTask(Context context, Handler handler, String name 11 , Map<Integer, Object> itemViews, int taskExecuteType) { 12 this.handler = handler; 13 } 14 15 @Override 16 public void run() { 17 /** 任务开始 **/ 18 Message startMsg = new Message(); 19 startMsg.what = ActionCode.TEST_START; 20 startMsg.obj = itemViewsMap; 21 startMsg.arg1 = taskExecuteType; 22 handler.sendMessage(startMsg); 23 } 24 25 public String getFileId() { 26 return name; 27 } 28 }
调用:添加下载任务到管理器,由管理器进行逐个执行。
1 // 1.new 一个线程管理类 2 downloadTaskMananger = DownloadTaskManager.getInstance(); 3 // 2.new一个线程池,并启动 4 DownloadTaskManagerThread downloadTaskManagerThread = new DownloadTaskManagerThread(); 5 new Thread(downloadTaskManagerThread).start();