pull/2/head
lyy 9 years ago
parent 5de6372579
commit 97d7a3e3ae
  1. 2
      .idea/misc.xml
  2. 43
      downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
  3. 16
      downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
  4. 4
      downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
  5. 43
      downloadutil/src/main/java/com/arialyy/downloadutil/util/DownLoadUtil.java
  6. 54
      downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java

@ -37,7 +37,7 @@
<ConfirmationsSetting value="0" id="Add" /> <ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" /> <ConfirmationsSetting value="0" id="Remove" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

@ -14,51 +14,45 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
/** /**
* 其它状态 * 其它状态
*/ */
@Ignore @Ignore public static final int STATE_OTHER = -1;
public static final int STATE_OTHER = -1;
/** /**
* 失败状态 * 失败状态
*/ */
@Ignore @Ignore public static final int STATE_FAIL = 0;
public static final int STATE_FAIL = 0;
/** /**
* 完成状态 * 完成状态
*/ */
@Ignore @Ignore public static final int STATE_COMPLETE = 1;
public static final int STATE_COMPLETE = 1;
/** /**
* 停止状态 * 停止状态
*/ */
@Ignore @Ignore public static final int STATE_STOP = 2;
public static final int STATE_STOP = 2;
/** /**
* 未开始状态 * 未开始状态
*/ */
@Ignore @Ignore public static final int STATE_WAIT = 3;
public static final int STATE_WAIT = 3;
/** /**
* 下载中 * 下载中
*/ */
@Ignore @Ignore public static final int STATE_DOWNLOAD_ING = 4;
public static final int STATE_DOWNLOAD_ING = 4;
/** /**
* 取消下载 * 取消下载
*/ */
@Ignore @Ignore public static final int STATE_CANCEL = 5;
public static final int STATE_CANCEL = 5;
private String downloadUrl = ""; //下载路径
private String downloadUrl; //下载路径 private String downloadPath = ""; //保存路径
private String downloadPath; //保存路径 private String fileName = ""; //文件名
private String fileName; //文件名 private String str = ""; //其它字段
private String str; //其它字段 private long completeTime; //完成时间
private long completeTime; //完成时间
private long fileSize = 1; private long fileSize = 1;
private int state = STATE_WAIT; private int state = STATE_WAIT;
private boolean isDownloadComplete = false; //是否下载完成 private boolean isDownloadComplete = false; //是否下载完成
private long currentProgress = 0; //当前下载进度 private long currentProgress = 0; //当前下载进度
private int failNum = 0; private int failNum = 0;
public DownloadEntity(){} public DownloadEntity() {
}
public String getStr() { public String getStr() {
return str; return str;
@ -154,9 +148,7 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
dest.writeLong(this.completeTime); dest.writeLong(this.completeTime);
dest.writeLong(this.fileSize); dest.writeLong(this.fileSize);
dest.writeInt(this.state); dest.writeInt(this.state);
dest.writeByte(this.isDownloadComplete ? dest.writeByte(this.isDownloadComplete ? (byte) 1 : (byte) 0);
(byte) 1 :
(byte) 0);
dest.writeLong(this.currentProgress); dest.writeLong(this.currentProgress);
dest.writeInt(this.failNum); dest.writeInt(this.failNum);
} }
@ -172,8 +164,7 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
this.failNum = in.readInt(); this.failNum = in.readInt();
} }
@Ignore @Ignore public static final Creator<DownloadEntity> CREATOR = new Creator<DownloadEntity>() {
public static final Creator<DownloadEntity> CREATOR = new Creator<DownloadEntity>() {
@Override public DownloadEntity createFromParcel(Parcel source) { @Override public DownloadEntity createFromParcel(Parcel source) {
return new DownloadEntity(source); return new DownloadEntity(source);
} }

@ -2,6 +2,8 @@ package com.arialyy.downloadutil.orm;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.arialyy.downloadutil.util.Util;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -57,8 +59,8 @@ public class DbEntity {
/** /**
* 保存自身如果表中已经有数据则更新数据否则插入数据 * 保存自身如果表中已经有数据则更新数据否则插入数据
*/ */
public void save() { public synchronized void save() {
if (thisIsExist()) { if (mUtil.tableExists(this) && thisIsExist()) {
update(); update();
} else { } else {
insert(); insert();
@ -70,7 +72,7 @@ public class DbEntity {
*/ */
private boolean thisIsExist() { private boolean thisIsExist() {
try { try {
Field[] fields = getClass().getFields(); Field[] fields = Util.getFields(getClass());
List<String> where = new ArrayList<>(); List<String> where = new ArrayList<>();
List<String> values = new ArrayList<>(); List<String> values = new ArrayList<>();
for (Field field : fields) { for (Field field : fields) {
@ -80,10 +82,10 @@ public class DbEntity {
continue; continue;
} }
where.add(field.getName()); where.add(field.getName());
values.add((String) field.get(getClass())); values.add(field.get(this) + "");
} }
return findData(getClass(), (String[]) where.toArray(), return findData(getClass(), where.toArray(new String[where.size()]),
(String[]) values.toArray()) != null; values.toArray(new String[values.size()])) != null;
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -124,6 +126,6 @@ public class DbEntity {
public <T extends DbEntity> T findData(Class<T> clazz, @NonNull String[] wheres, public <T extends DbEntity> T findData(Class<T> clazz, @NonNull String[] wheres,
@NonNull String[] values) { @NonNull String[] values) {
List<T> datas = mUtil.findData(clazz, this, wheres, values); List<T> datas = mUtil.findData(clazz, this, wheres, values);
return datas.size() > 0 ? datas.get(0) : null; return datas == null ? null : datas.size() > 0 ? datas.get(0) : null;
} }
} }

@ -149,7 +149,7 @@ public class DbUtil {
int i = 0; int i = 0;
for (Object where : wheres) { for (Object where : wheres) {
sb.append(where).append("=").append("'").append(values[i]).append("'"); sb.append(where).append("=").append("'").append(values[i]).append("'");
sb.append(i >= wheres.length - 1 ? "" : ", "); sb.append(i >= wheres.length - 1 ? "" : " AND ");
i++; i++;
} }
print(FIND_DATA, sb.toString()); print(FIND_DATA, sb.toString());
@ -208,7 +208,7 @@ public class DbUtil {
/** /**
* 查找某张表是否存在 * 查找某张表是否存在
*/ */
public boolean tableExists(DbEntity dbEntity) { public synchronized boolean tableExists(DbEntity dbEntity) {
Cursor cursor = null; Cursor cursor = null;
try { try {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();

@ -25,16 +25,16 @@ public class DownLoadUtil {
/** /**
* 线程数 * 线程数
*/ */
private static final int THREAD_NUM = 3; private static final int THREAD_NUM = 3;
private static final int TIME_OUT = 5000; //超时时间
/** /**
* 已经完成下载任务的线程数量 * 已经完成下载任务的线程数量
*/ */
private int mCompleteThreadNum = 0; private int mCompleteThreadNum = 0;
private boolean isDownloading = false;
private boolean isStop = false;
private boolean isCancel = false;
private long mCurrentLocation; private long mCurrentLocation;
private boolean isDownloading = false;
private boolean isStop = false;
private boolean isCancel = false;
private static final int TIME_OUT = 5000; //超时时间
boolean isNewTask = true; boolean isNewTask = true;
private int mCancelNum = 0; private int mCancelNum = 0;
private int mStopNum = 0; private int mStopNum = 0;
@ -114,9 +114,9 @@ public class DownLoadUtil {
conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Charset", "UTF-8");
conn.setConnectTimeout(TIME_OUT * 4); conn.setConnectTimeout(TIME_OUT * 4);
conn.setRequestProperty("User-Agent", conn.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
conn.setRequestProperty("Accept", conn.setRequestProperty("Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
conn.connect(); conn.connect();
int len = conn.getContentLength(); int len = conn.getContentLength();
if (len < 0) { //网络被劫持时会出现这个问题 if (len < 0) { //网络被劫持时会出现这个问题
@ -197,7 +197,8 @@ public class DownLoadUtil {
endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度 endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度
} }
DownloadEntity entity = new DownloadEntity(context, fileLength, DownloadEntity entity = new DownloadEntity(context, fileLength,
downloadUrl, dFile, i, startL, endL); downloadUrl, dFile, i,
startL, endL);
DownLoadTask task = new DownLoadTask(entity); DownLoadTask task = new DownLoadTask(entity);
tasks.put(i, new Thread(task)); tasks.put(i, new Thread(task));
} }
@ -230,7 +231,6 @@ public class DownLoadUtil {
isDownloading = false; isDownloading = false;
stopDownload(); stopDownload();
mListener.onFail(); mListener.onFail();
System.gc();
} }
/** /**
@ -244,26 +244,26 @@ public class DownLoadUtil {
public DownLoadTask(DownloadEntity downloadInfo) { public DownLoadTask(DownloadEntity downloadInfo) {
this.dEntity = downloadInfo; this.dEntity = downloadInfo;
configFPath = dEntity.context.getFilesDir() configFPath = dEntity.context.getFilesDir()
.getPath() + "/temp/" + dEntity.tempFile.getName() + ".properties"; .getPath() + "/temp/" + dEntity.tempFile.getName() + ".properties";
} }
@Override public void run() { @Override public void run() {
long currentLocation = 0; long currentLocation = 0;
try { try {
Log.d(TAG, Log.d(TAG,
"线程_" + dEntity.threadId + "_正在下载【" + "开始位置 : " + dEntity.startLocation + ",结束位置:" + dEntity.endLocation + "】"); "线程_" + dEntity.threadId + "_正在下载【" + "开始位置 : " + dEntity.startLocation + ",结束位置:" + dEntity.endLocation + "】");
URL url = new URL(dEntity.downloadUrl); URL url = new URL(dEntity.downloadUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//在头里面请求下载开始位置和结束位置 //在头里面请求下载开始位置和结束位置
conn.setRequestProperty("Range", conn.setRequestProperty("Range",
"bytes=" + dEntity.startLocation + "-" + dEntity.endLocation); "bytes=" + dEntity.startLocation + "-" + dEntity.endLocation);
conn.setRequestMethod("GET"); conn.setRequestMethod("GET");
conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Charset", "UTF-8");
conn.setConnectTimeout(TIME_OUT * 4); conn.setConnectTimeout(TIME_OUT * 4);
conn.setRequestProperty("User-Agent", conn.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
conn.setRequestProperty("Accept", conn.setRequestProperty("Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
conn.setReadTimeout(TIME_OUT * 24); //设置读取流的等待时间,必须设置该参数 conn.setReadTimeout(TIME_OUT * 24); //设置读取流的等待时间,必须设置该参数
InputStream is = conn.getInputStream(); InputStream is = conn.getInputStream();
//创建可设置位置的文件 //创建可设置位置的文件
@ -306,7 +306,6 @@ public class DownLoadUtil {
Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++"); Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
isDownloading = false; isDownloading = false;
mListener.onCancel(); mListener.onCancel();
System.gc();
} }
} }
return; return;
@ -317,14 +316,13 @@ public class DownLoadUtil {
mStopNum++; mStopNum++;
String location = String.valueOf(currentLocation); String location = String.valueOf(currentLocation);
Log.i(TAG, Log.i(TAG,
"thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation); "thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation);
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
location); location);
if (mStopNum == THREAD_NUM) { if (mStopNum == THREAD_NUM) {
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++"); Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
isDownloading = false; isDownloading = false;
mListener.onStop(mCurrentLocation); mListener.onStop(mCurrentLocation);
System.gc();
} }
} }
return; return;
@ -340,7 +338,6 @@ public class DownLoadUtil {
} }
isDownloading = false; isDownloading = false;
mListener.onComplete(); mListener.onComplete();
System.gc();
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
e.printStackTrace(); e.printStackTrace();
@ -349,7 +346,7 @@ public class DownLoadUtil {
try { try {
String location = String.valueOf(currentLocation); String location = String.valueOf(currentLocation);
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
location); location);
failDownload("下载链接异常"); failDownload("下载链接异常");
} catch (IOException e1) { } catch (IOException e1) {
e1.printStackTrace(); e1.printStackTrace();
@ -360,7 +357,7 @@ public class DownLoadUtil {
try { try {
String location = String.valueOf(currentLocation); String location = String.valueOf(currentLocation);
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
location); location);
failDownload( failDownload(
"下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e)); "下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e));
} catch (IOException e1) { } catch (IOException e1) {
@ -372,7 +369,7 @@ public class DownLoadUtil {
try { try {
String location = String.valueOf(currentLocation); String location = String.valueOf(currentLocation);
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
location); location);
failDownload("获取流失败" + Util.getPrintException(e)); failDownload("获取流失败" + Util.getPrintException(e));
} catch (IOException e1) { } catch (IOException e1) {
e1.printStackTrace(); e1.printStackTrace();

@ -18,6 +18,45 @@ import java.util.Properties;
public class Util { public class Util {
private static final String TAG = "util"; private static final String TAG = "util";
/**
* 获取类里面的所在字段
*/
public static Field[] getFields(Class clazz) {
Field[] fields = null;
fields = clazz.getDeclaredFields();
if (fields == null || fields.length == 0) {
Class superClazz = clazz.getSuperclass();
if (superClazz != null) {
fields = getFields(superClazz);
}
}
return fields;
}
/**
* 获取类里面的指定对象如果该类没有则从父类查询
*/
public static Field getField(Class clazz, String name) {
Field field = null;
try {
field = clazz.getDeclaredField(name);
} catch (NoSuchFieldException e) {
try {
field = clazz.getField(name);
} catch (NoSuchFieldException e1) {
if (clazz.getSuperclass() == null) {
return field;
} else {
field = getField(clazz.getSuperclass(), name);
}
}
}
if (field != null) {
field.setAccessible(true);
}
return field;
}
/** /**
* 将缓存的key转换为hash码 * 将缓存的key转换为hash码
* *
@ -53,21 +92,6 @@ public class Util {
return stringBuilder.toString(); return stringBuilder.toString();
} }
/**
* 获取类里面的所在字段
*/
public static Field[] getFields(Class clazz) {
Field[] fields = null;
fields = clazz.getDeclaredFields();
if (fields == null || fields.length == 0) {
Class superClazz = clazz.getSuperclass();
if (superClazz != null) {
fields = getFields(superClazz);
}
}
return fields;
}
/** /**
* 获取对象名 * 获取对象名
* *

Loading…
Cancel
Save