parent
57f804cc89
commit
aeb1820079
@ -1,27 +1,99 @@ |
|||||||
package com.arialyy.downloadutil.core.pool; |
package com.arialyy.downloadutil.core.pool; |
||||||
|
|
||||||
|
import android.util.Log; |
||||||
|
|
||||||
import com.arialyy.downloadutil.core.Task; |
import com.arialyy.downloadutil.core.Task; |
||||||
import com.arialyy.downloadutil.core.inf.IPool; |
import com.arialyy.downloadutil.core.inf.IPool; |
||||||
|
import com.arialyy.downloadutil.util.Util; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.PriorityQueue; |
||||||
|
import java.util.Queue; |
||||||
|
|
||||||
/** |
/** |
||||||
* Created by lyy on 2016/8/14. |
* Created by lyy on 2016/8/14. |
||||||
* 任务缓存池,所有下载任务最先缓存在这个池中 |
* 任务缓存池,所有下载任务最先缓存在这个池中 |
||||||
*/ |
*/ |
||||||
public class CachePool implements IPool { |
public class CachePool implements IPool { |
||||||
|
private static final String TAG = "CachePool"; |
||||||
|
private static final Object LOCK = new Object(); |
||||||
|
private static volatile CachePool INSTANCE = null; |
||||||
|
private Map<String, Task> mCacheArray; |
||||||
|
private Queue<Task> mCacheQueue; |
||||||
|
|
||||||
|
public static CachePool getInstance() { |
||||||
|
if (INSTANCE == null) { |
||||||
|
synchronized (LOCK) { |
||||||
|
INSTANCE = new CachePool(); |
||||||
|
} |
||||||
|
} |
||||||
|
return INSTANCE; |
||||||
|
} |
||||||
|
|
||||||
|
private CachePool() { |
||||||
|
mCacheQueue = new PriorityQueue<>(); |
||||||
|
mCacheArray = new HashMap<>(); |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public synchronized void putTask(Task task) { |
public boolean putTask(Task task) { |
||||||
|
synchronized (LOCK) { |
||||||
|
if (task == null) { |
||||||
|
Log.e(TAG, "下载任务不能为空!!"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
String url = task.getDownloadEntity().getDownloadUrl(); |
||||||
|
if (mCacheQueue.contains(task)) { |
||||||
|
Log.e(TAG, "队列中已经包含了该任务,任务下载链接【" + url + "】"); |
||||||
|
return false; |
||||||
|
} else { |
||||||
|
boolean s = mCacheQueue.offer(task); |
||||||
|
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】")); |
||||||
|
if (s) { |
||||||
|
mCacheArray.put(Util.keyToHashKey(url), task); |
||||||
|
} |
||||||
|
return s; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Task pollTask() { |
||||||
|
synchronized (LOCK) { |
||||||
|
Task task = mCacheQueue.poll(); |
||||||
|
if (task != null) { |
||||||
|
String url = task.getDownloadEntity().getDownloadUrl(); |
||||||
|
mCacheArray.remove(Util.keyToHashKey(url)); |
||||||
|
} |
||||||
|
return task; |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public synchronized Task getTask(String downloadUrl) { |
public Task getTask(String downloadUrl) { |
||||||
return null; |
synchronized (LOCK) { |
||||||
|
String key = Util.keyToHashKey(downloadUrl); |
||||||
|
Task task = mCacheArray.get(key); |
||||||
|
if (task != null) { |
||||||
|
mCacheArray.remove(key); |
||||||
|
mCacheQueue.remove(task); |
||||||
|
} |
||||||
|
return task; |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public synchronized boolean removeTask(Task task) { |
public boolean removeTask(Task task) { |
||||||
return false; |
synchronized (LOCK) { |
||||||
|
if (task == null) { |
||||||
|
Log.e(TAG, "任务不能为空"); |
||||||
|
return false; |
||||||
|
} else { |
||||||
|
String key = Util.keyToHashKey(task.getDownloadEntity().getDownloadUrl()); |
||||||
|
mCacheArray.remove(key); |
||||||
|
return mCacheQueue.remove(task); |
||||||
|
} |
||||||
|
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,144 @@ |
|||||||
|
package com.arialyy.downloadutil.core.pool; |
||||||
|
|
||||||
|
import android.util.Log; |
||||||
|
|
||||||
|
import com.arialyy.downloadutil.core.Task; |
||||||
|
import com.arialyy.downloadutil.core.inf.IPool; |
||||||
|
import com.arialyy.downloadutil.util.Util; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.concurrent.ArrayBlockingQueue; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by lyy on 2016/8/15. |
||||||
|
* 任务执行池,所有当前下载任务都该任务池中,默认下载大小为2 |
||||||
|
*/ |
||||||
|
public class ExecutePool implements IPool { |
||||||
|
private static final String TAG = "ExecutePool"; |
||||||
|
private static final Object LOCK = new Object(); |
||||||
|
private static final long TIME_OUT = 1000; |
||||||
|
private static volatile ExecutePool INSTANCE = null; |
||||||
|
private static int SIZE = 2; |
||||||
|
private ArrayBlockingQueue<Task> mExecuteQueue; |
||||||
|
private Map<String, Task> mExecuteArray; |
||||||
|
|
||||||
|
public static ExecutePool getInstance() { |
||||||
|
if (INSTANCE == null) { |
||||||
|
synchronized (LOCK) { |
||||||
|
INSTANCE = new ExecutePool(); |
||||||
|
} |
||||||
|
} |
||||||
|
return INSTANCE; |
||||||
|
} |
||||||
|
|
||||||
|
private ExecutePool() { |
||||||
|
mExecuteQueue = new ArrayBlockingQueue<>(SIZE); |
||||||
|
mExecuteArray = new HashMap<>(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean putTask(Task task) { |
||||||
|
synchronized (LOCK) { |
||||||
|
if (task == null) { |
||||||
|
Log.e(TAG, "下载任务不能为空!!"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
String url = task.getDownloadEntity().getDownloadUrl(); |
||||||
|
if (mExecuteQueue.contains(task)) { |
||||||
|
Log.e(TAG, "队列中已经包含了该任务,任务下载链接【" + url + "】"); |
||||||
|
return false; |
||||||
|
} else { |
||||||
|
if (mExecuteQueue.size() >= SIZE) { |
||||||
|
if (pollFirstTask()) { |
||||||
|
return putNewTask(task); |
||||||
|
} |
||||||
|
} else { |
||||||
|
return putNewTask(task); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加新任务 |
||||||
|
* |
||||||
|
* @param newTask 新下载任务 |
||||||
|
*/ |
||||||
|
private boolean putNewTask(Task newTask) { |
||||||
|
String url = newTask.getDownloadEntity().getDownloadUrl(); |
||||||
|
boolean s = mExecuteQueue.offer(newTask); |
||||||
|
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】")); |
||||||
|
if (s) { |
||||||
|
newTask.start(); |
||||||
|
mExecuteArray.put(Util.keyToHashKey(url), newTask); |
||||||
|
} |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 队列满时,将移除下载队列中的第一个任务 |
||||||
|
*/ |
||||||
|
private boolean pollFirstTask() { |
||||||
|
try { |
||||||
|
Task oldTask = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS); |
||||||
|
if (oldTask == null) { |
||||||
|
Log.e(TAG, "移除任务失败"); |
||||||
|
return false; |
||||||
|
} |
||||||
|
oldTask.stop(); |
||||||
|
wait(200); |
||||||
|
String key = Util.keyToHashKey(oldTask.getDownloadEntity().getDownloadUrl()); |
||||||
|
mExecuteArray.remove(key); |
||||||
|
} catch (InterruptedException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Task pollTask() { |
||||||
|
synchronized (LOCK) { |
||||||
|
Task task = mExecuteQueue.poll(); |
||||||
|
if (task != null) { |
||||||
|
task.stop(); |
||||||
|
String url = task.getDownloadEntity().getDownloadUrl(); |
||||||
|
mExecuteArray.remove(Util.keyToHashKey(url)); |
||||||
|
} |
||||||
|
return task; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Task getTask(String downloadUrl) { |
||||||
|
synchronized (LOCK) { |
||||||
|
String key = Util.keyToHashKey(downloadUrl); |
||||||
|
Task task = mExecuteArray.get(key); |
||||||
|
if (task != null) { |
||||||
|
task.stop(); |
||||||
|
mExecuteArray.remove(key); |
||||||
|
mExecuteQueue.remove(task); |
||||||
|
} |
||||||
|
return task; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean removeTask(Task task) { |
||||||
|
synchronized (LOCK) { |
||||||
|
if (task == null) { |
||||||
|
Log.e(TAG, "任务不能为空"); |
||||||
|
return false; |
||||||
|
} else { |
||||||
|
task.stop(); |
||||||
|
String key = Util.keyToHashKey(task.getDownloadEntity().getDownloadUrl()); |
||||||
|
mExecuteArray.remove(key); |
||||||
|
return mExecuteQueue.remove(task); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package com.arialyy.downloadutil.inf; |
package com.arialyy.downloadutil.util; |
||||||
|
|
||||||
import java.net.HttpURLConnection; |
import java.net.HttpURLConnection; |
||||||
|
|
Loading…
Reference in new issue