From 0d9afbe1b44d2cf2aa85076109b1d82f1914b793 Mon Sep 17 00:00:00 2001 From: lyy <511455842@qq.com> Date: Sat, 8 Oct 2016 15:11:16 +0800 Subject: [PATCH] fix bug --- .../simple/adapter/DownloadAdapter.java | 39 +++++++++++++++---- app/src/main/res/values/strings.xml | 6 +-- .../downloadutil/core/IDownloadTarget.java | 13 +++---- .../downloadutil/core/pool/CachePool.java | 20 +++++----- .../downloadutil/core/pool/ExecutePool.java | 2 +- .../arialyy/downloadutil/orm/DbEntity.java | 2 +- .../com/arialyy/downloadutil/orm/DbUtil.java | 20 +++++----- .../com/arialyy/downloadutil/util/Util.java | 2 +- 8 files changed, 63 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java index 062e5538..80df2f7b 100644 --- a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java +++ b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java @@ -1,7 +1,7 @@ package com.arialyy.simple.adapter; import android.content.Context; -import android.util.SparseIntArray; +import android.content.res.Resources; import android.view.View; import android.widget.Button; @@ -11,7 +11,6 @@ import com.arialyy.downloadutil.core.DownloadManager; import com.arialyy.downloadutil.core.command.CommandFactory; import com.arialyy.downloadutil.core.command.IDownloadCommand; import com.arialyy.downloadutil.entity.DownloadEntity; -import com.arialyy.downloadutil.util.Util; import com.arialyy.simple.R; import com.arialyy.simple.widget.HorizontalProgressBarWithNumber; @@ -19,6 +18,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import butterknife.Bind; @@ -30,15 +30,15 @@ public class DownloadAdapter extends AbsRVAdapter mProgress = new HashMap<>(); - private SparseIntArray mPositions = new SparseIntArray(); + private Map mProgress = new HashMap<>(); + private Map mPositions = new HashMap<>(); public DownloadAdapter(Context context, List data) { super(context, data); int i = 0; for (DownloadEntity entity : data) { mProgress.put(entity.getDownloadUrl(), entity.getCurrentProgress()); - mPositions.append(i, Util.keyToHashCode(entity.getDownloadUrl())); + mPositions.put(entity.getDownloadUrl(), i); i++; } mFactory = CommandFactory.getInstance(); @@ -59,11 +59,21 @@ public class DownloadAdapter extends AbsRVAdapter " + index); +// notifyItemChanged(index); notifyItemChanged(indexItem(url)); } - private int indexItem(String url) { - return mPositions.indexOfValue(Util.keyToHashCode(url)); + private synchronized int indexItem(String url) { + Set set = mPositions.entrySet(); + for (Object aSet : set) { + Map.Entry entry = (Map.Entry) aSet; + if (entry.getKey().equals(url)) { + return (int) entry.getValue(); + } + } + return -1; } @Override protected void bindData(MyHolder holder, int position, DownloadEntity item) { @@ -81,7 +91,8 @@ public class DownloadAdapter extends AbsRVAdapter http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk - - - + http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk + http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk + http://static.gaoshouyou.com/d/d4/4f/d6d48db3794fb9ecf47e83c346570881.apk diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java index f7e80963..42dbe03a 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java @@ -100,9 +100,10 @@ public abstract class IDownloadTarget implements IDownloader, ITask { /** * 获取任务执行池 + * * @return */ - public ExecutePool getExecutePool(){ + public ExecutePool getExecutePool() { return mExecutePool; } @@ -152,11 +153,7 @@ public abstract class IDownloadTarget implements IDownloader, ITask { } switch (msg.what) { case STOP: - startNextTask(entity); - break; case CANCEL: - startNextTask(entity); - break; case COMPLETE: startNextTask(entity); break; @@ -187,7 +184,7 @@ public abstract class IDownloadTarget implements IDownloader, ITask { target.mTargetListener.onTaskCancel(task); break; case COMPLETE: - target.mTargetListener.onTaskCancel(task); + target.mTargetListener.onTaskComplete(task); break; case FAIL: target.mTargetListener.onTaskFail(task); @@ -222,7 +219,9 @@ public abstract class IDownloadTarget implements IDownloader, ITask { Log.w(TAG, "没有下一任务"); return; } - target.startTask(newTask); + if (newTask.getDownloadEntity().getState() == DownloadEntity.STATE_WAIT) { + target.startTask(newTask); + } } } } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/CachePool.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/CachePool.java index 902640f6..1ea39a51 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/CachePool.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/CachePool.java @@ -3,25 +3,25 @@ package com.arialyy.downloadutil.core.pool; import android.text.TextUtils; import android.util.Log; -import com.arialyy.downloadutil.util.Task; import com.arialyy.downloadutil.core.inf.IPool; +import com.arialyy.downloadutil.util.Task; import com.arialyy.downloadutil.util.Util; import java.util.HashMap; import java.util.Map; -import java.util.PriorityQueue; -import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; /** * Created by lyy on 2016/8/14. * 任务缓存池,所有下载任务最先缓存在这个池中 */ 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 mCacheArray; - private Queue mCacheQueue; + private static final String TAG = "CachePool"; + private static final Object LOCK = new Object(); + private static final int MAX_NUM = Integer.MAX_VALUE; //最大下载任务数 + private static volatile CachePool INSTANCE = null; + private Map mCacheArray; + private LinkedBlockingQueue mCacheQueue; public static CachePool getInstance() { if (INSTANCE == null) { @@ -33,7 +33,7 @@ public class CachePool implements IPool { } private CachePool() { - mCacheQueue = new PriorityQueue<>(); + mCacheQueue = new LinkedBlockingQueue<>(MAX_NUM); mCacheArray = new HashMap<>(); } @@ -48,7 +48,7 @@ public class CachePool implements IPool { Log.w(TAG, "队列中已经包含了该任务,任务下载链接【" + url + "】"); return false; } else { - boolean s = mCacheQueue.offer(task); + boolean s = mCacheQueue.offer(task); Log.d(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】")); if (s) { mCacheArray.put(Util.keyToHashKey(url), task); diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/ExecutePool.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/ExecutePool.java index 16a0efb0..fdfef090 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/ExecutePool.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/pool/ExecutePool.java @@ -89,7 +89,7 @@ public class ExecutePool implements IPool { return false; } oldTask.stop(); - wait(200); +// wait(200); String key = Util.keyToHashKey(oldTask.getDownloadEntity().getDownloadUrl()); mExecuteArray.remove(key); } catch (InterruptedException e) { diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java index b9b7be3d..aad2b957 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java @@ -59,7 +59,7 @@ public class DbEntity { /** * 保存自身,如果表中已经有数据,则更新数据,否则插入数据 */ - public synchronized void save() { + public void save() { if (mUtil.tableExists(getClass()) && thisIsExist()) { update(); } else { diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java index 3c487d8f..fe21159b 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java @@ -62,7 +62,7 @@ public class DbUtil { /** * 删除某条数据 */ - void delData(Class clazz, @NonNull Object[] wheres, + synchronized void delData(Class clazz, @NonNull Object[] wheres, @NonNull Object[] values) { mDb = mHelper.getWritableDatabase(); if (wheres.length <= 0 || values.length <= 0) { @@ -88,7 +88,7 @@ public class DbUtil { /** * 修改某行数据 */ - void modifyData(DbEntity dbEntity) { + synchronized void modifyData(DbEntity dbEntity) { mDb = mHelper.getWritableDatabase(); Class clazz = dbEntity.getClass(); Field[] fields = Util.getFields(clazz); @@ -123,7 +123,7 @@ public class DbUtil { /** * 遍历所有数据 */ - List findAllData(Class clazz) { + synchronized List findAllData(Class clazz) { if (!tableExists(clazz)) { createTable(clazz); } @@ -138,7 +138,7 @@ public class DbUtil { /** * 条件查寻数据 */ - List findData(Class clazz, @NonNull String[] wheres, + synchronized List findData(Class clazz, @NonNull String[] wheres, @NonNull String[] values) { if (!tableExists(clazz)) { createTable(clazz); @@ -167,7 +167,7 @@ public class DbUtil { /** * 插入数据 */ - void insertData(DbEntity dbEntity) { + synchronized void insertData(DbEntity dbEntity) { Class clazz = dbEntity.getClass(); if (!tableExists(clazz)) { createTable(clazz); @@ -245,7 +245,7 @@ public class DbUtil { /** * 创建表 */ - private void createTable(Class clazz) { + private synchronized void createTable(Class clazz) { if (mDb == null || !mDb.isOpen()) { mDb = mHelper.getWritableDatabase(); } @@ -321,7 +321,7 @@ public class DbUtil { /** * 关闭数据库 */ - private void close() { + private synchronized void close() { if (mDb != null) { mDb.close(); } @@ -330,7 +330,7 @@ public class DbUtil { /** * 获取所在行Id */ - int[] getRowId(Class clazz) { + synchronized int[] getRowId(Class clazz) { mDb = mHelper.getReadableDatabase(); Cursor cursor = mDb.rawQuery("SELECT rowid, * FROM " + Util.getClassName(clazz), null); int[] ids = new int[cursor.getCount()]; @@ -347,7 +347,7 @@ public class DbUtil { /** * 获取行Id */ - int getRowId(Class clazz, Object[] wheres, Object[] values) { + synchronized int getRowId(Class clazz, Object[] wheres, Object[] values) { mDb = mHelper.getReadableDatabase(); if (wheres.length <= 0 || values.length <= 0) { Log.e(TAG, "请输入删除条件"); @@ -375,7 +375,7 @@ public class DbUtil { /** * 根据数据游标创建一个具体的对象 */ - private List newInstanceEntity(Class clazz, Cursor cursor) { + private synchronized List newInstanceEntity(Class clazz, Cursor cursor) { Field[] fields = Util.getFields(clazz); List entitys = new ArrayList<>(); if (fields != null && fields.length > 0) { diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java b/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java index 5135ad10..a1220ff9 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java @@ -65,7 +65,7 @@ public class Util { */ public static int keyToHashCode(String str) { int total = 0; - for (int i = 0; i < str.length() && i < 6; i++) { + for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); if (ch == '-') ch = (char) 28; // does not contain the same last 5 bits as any letter if (ch == '\'') ch = (char) 29; // nor this