diff --git a/.idea/misc.xml b/.idea/misc.xml
index ba75a422..75318f72 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -53,25 +53,10 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index f8b703b0..f5d01443 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,6 +17,10 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+
+ dataBinding {
+ enabled = true
+ }
}
dependencies {
@@ -24,5 +28,9 @@ dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.+'
compile 'com.android.support:design:23.+'
+ compile 'com.jakewharton:butterknife:7.0.1'
+ compile 'com.google.code.gson:gson:2.7'
+ compile 'com.squareup.okhttp3:okhttp:3.2.0'
+ compile 'com.arialyy.frame:MVVM2:2.2.0'
compile project(':downloadutil')
}
diff --git a/app/src/main/java/com/example/arial/downloaddemo/MainActivity.java b/app/src/main/java/com/example/arial/downloaddemo/MainActivity.java
index 1cf79432..12f5c03b 100644
--- a/app/src/main/java/com/example/arial/downloaddemo/MainActivity.java
+++ b/app/src/main/java/com/example/arial/downloaddemo/MainActivity.java
@@ -18,159 +18,149 @@ import com.arialyy.downloadutil.util.Util;
import java.net.HttpURLConnection;
public class MainActivity extends AppCompatActivity {
- private static final int DOWNLOAD_PRE = 0x01;
- private static final int DOWNLOAD_STOP = 0x02;
- private static final int DOWNLOAD_FAILE = 0x03;
- private static final int DOWNLOAD_CANCEL = 0x04;
- private static final int DOWNLOAD_RESUME = 0x05;
- private static final int DOWNLOAD_COMPLETE = 0x06;
- private ProgressBar mPb;
- private String mDownloadUrl = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk";
- private DownLoadUtil mUtil;
- private Button mStart, mStop, mCancel;
- private TextView mSize;
-
- private Handler mUpdateHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case DOWNLOAD_PRE:
- mSize.setText(Util.formatFileSize((Long) msg.obj));
- mStart.setEnabled(false);
- break;
- case DOWNLOAD_FAILE:
- Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
- break;
- case DOWNLOAD_STOP:
- Toast.makeText(MainActivity.this, "暂停下载", Toast.LENGTH_SHORT).show();
- mStart.setText("恢复");
- mStart.setEnabled(true);
- break;
- case DOWNLOAD_CANCEL:
- mPb.setProgress(0);
- Toast.makeText(MainActivity.this, "取消下载", Toast.LENGTH_SHORT).show();
- mStart.setEnabled(true);
- mStart.setText("开始");
- break;
- case DOWNLOAD_RESUME:
- Toast.makeText(MainActivity.this, "恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj), Toast.LENGTH_SHORT).show();
- mStart.setEnabled(false);
- break;
- case DOWNLOAD_COMPLETE:
- Toast.makeText(MainActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
- mStart.setEnabled(true);
- mCancel.setEnabled(false);
- mStop.setEnabled(false);
- break;
- }
- }
- };
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- init();
+ private static final int DOWNLOAD_PRE = 0x01;
+ private static final int DOWNLOAD_STOP = 0x02;
+ private static final int DOWNLOAD_FAILE = 0x03;
+ private static final int DOWNLOAD_CANCEL = 0x04;
+ private static final int DOWNLOAD_RESUME = 0x05;
+ private static final int DOWNLOAD_COMPLETE = 0x06;
+ private ProgressBar mPb;
+ private String mDownloadUrl =
+ "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk";
+ private DownLoadUtil mUtil;
+ private Button mStart, mStop, mCancel;
+ private TextView mSize;
+
+ private Handler mUpdateHandler = new Handler() {
+ @Override public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what) {
+ case DOWNLOAD_PRE:
+ mSize.setText(Util.formatFileSize((Long) msg.obj));
+ mStart.setEnabled(false);
+ break;
+ case DOWNLOAD_FAILE:
+ Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
+ break;
+ case DOWNLOAD_STOP:
+ Toast.makeText(MainActivity.this, "暂停下载", Toast.LENGTH_SHORT).show();
+ mStart.setText("恢复");
+ mStart.setEnabled(true);
+ break;
+ case DOWNLOAD_CANCEL:
+ mPb.setProgress(0);
+ Toast.makeText(MainActivity.this, "取消下载", Toast.LENGTH_SHORT).show();
+ mStart.setEnabled(true);
+ mStart.setText("开始");
+ break;
+ case DOWNLOAD_RESUME:
+ Toast.makeText(MainActivity.this, "恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj),
+ Toast.LENGTH_SHORT).show();
+ mStart.setEnabled(false);
+ break;
+ case DOWNLOAD_COMPLETE:
+ Toast.makeText(MainActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
+ mStart.setEnabled(true);
+ mCancel.setEnabled(false);
+ mStop.setEnabled(false);
+ break;
+ }
}
-
- private void init() {
- mPb = (ProgressBar) findViewById(R.id.progressBar);
- mStart = (Button) findViewById(R.id.start);
- mStop = (Button) findViewById(R.id.stop);
- mCancel = (Button) findViewById(R.id.cancel);
- mSize = (TextView) findViewById(R.id.size);
- mUtil = new DownLoadUtil();
- }
-
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.start:
- start();
- break;
- case R.id.stop:
- stop();
- break;
- case R.id.cancel:
- cancel();
- break;
- }
- }
-
- private void start() {
- mUtil.download(this, mDownloadUrl, Environment.getExternalStorageDirectory().getPath() + "/test.apk"
- , new DownLoadUtil.DownloadListener() {
- long fileSize = 1;
-
- @Override
- public void onPreDownload(HttpURLConnection connection) {
- super.onPreDownload(connection);
- mPb.setMax(100);
- fileSize = connection.getContentLength();
- mUpdateHandler.obtainMessage(DOWNLOAD_PRE, fileSize).sendToTarget();
- }
-
- @Override
- public void onStart(long startLocation) {
- super.onStart(startLocation);
- }
-
- @Override
- public void onChildResume(long resumeLocation) {
- super.onChildResume(resumeLocation);
- }
-
- @Override
- public void onChildComplete(long finishLocation) {
- super.onChildComplete(finishLocation);
- }
-
- @Override
- public void onProgress(long currentLocation) {
- super.onProgress(currentLocation);
- mPb.setProgress((int) (currentLocation * 100 / fileSize));
- }
-
- @Override
- public void onStop(long stopLocation) {
- super.onStop(stopLocation);
- mUpdateHandler.obtainMessage(DOWNLOAD_STOP).sendToTarget();
- }
-
- @Override
- public void onCancel() {
- super.onCancel();
- mUpdateHandler.obtainMessage(DOWNLOAD_CANCEL).sendToTarget();
- }
-
- @Override
- public void onResume(long resumeLocation) {
- super.onResume(resumeLocation);
- mUpdateHandler.obtainMessage(DOWNLOAD_RESUME, resumeLocation).sendToTarget();
- }
-
- @Override
- public void onFail() {
- super.onFail();
- mUpdateHandler.obtainMessage(DOWNLOAD_FAILE).sendToTarget();
- }
-
- @Override
- public void onComplete() {
- super.onComplete();
- mUpdateHandler.obtainMessage(DOWNLOAD_COMPLETE).sendToTarget();
- }
- });
+ };
+
+ @Override protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ init();
+ }
+
+ private void init() {
+ mPb = (ProgressBar) findViewById(R.id.progressBar);
+ mStart = (Button) findViewById(R.id.start);
+ mStop = (Button) findViewById(R.id.stop);
+ mCancel = (Button) findViewById(R.id.cancel);
+ mSize = (TextView) findViewById(R.id.size);
+ mUtil = new DownLoadUtil();
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.start:
+ start();
+ break;
+ case R.id.stop:
+ stop();
+ break;
+ case R.id.cancel:
+ cancel();
+ break;
}
-
- private void stop() {
- mUtil.stopDownload();
- }
-
- private void cancel() {
- mUtil.cancelDownload();
- }
-
+ }
+
+ private void start() {
+ mUtil.download(this, mDownloadUrl,
+ Environment.getExternalStorageDirectory().getPath() + "/test.apk",
+ new DownLoadUtil.DownloadListener() {
+ long fileSize = 1;
+
+ @Override public void onPreDownload(HttpURLConnection connection) {
+ super.onPreDownload(connection);
+ mPb.setMax(100);
+ fileSize = connection.getContentLength();
+ mUpdateHandler.obtainMessage(DOWNLOAD_PRE, fileSize).sendToTarget();
+ }
+
+ @Override public void onStart(long startLocation) {
+ super.onStart(startLocation);
+ }
+
+ @Override public void onChildResume(long resumeLocation) {
+ super.onChildResume(resumeLocation);
+ }
+
+ @Override public void onChildComplete(long finishLocation) {
+ super.onChildComplete(finishLocation);
+ }
+
+ @Override public void onProgress(long currentLocation) {
+ super.onProgress(currentLocation);
+ mPb.setProgress((int) (currentLocation * 100 / fileSize));
+ }
+
+ @Override public void onStop(long stopLocation) {
+ super.onStop(stopLocation);
+ mUpdateHandler.obtainMessage(DOWNLOAD_STOP).sendToTarget();
+ }
+
+ @Override public void onCancel() {
+ super.onCancel();
+ mUpdateHandler.obtainMessage(DOWNLOAD_CANCEL).sendToTarget();
+ }
+
+ @Override public void onResume(long resumeLocation) {
+ super.onResume(resumeLocation);
+ mUpdateHandler.obtainMessage(DOWNLOAD_RESUME, resumeLocation).sendToTarget();
+ }
+
+ @Override public void onFail() {
+ super.onFail();
+ mUpdateHandler.obtainMessage(DOWNLOAD_FAILE).sendToTarget();
+ }
+
+ @Override public void onComplete() {
+ super.onComplete();
+ mUpdateHandler.obtainMessage(DOWNLOAD_COMPLETE).sendToTarget();
+ }
+ });
+ }
+
+ private void stop() {
+ mUtil.stopDownload();
+ }
+
+ private void cancel() {
+ mUtil.cancelDownload();
+ }
}
diff --git a/downloadutil/build.gradle b/downloadutil/build.gradle
index b0037d56..af305188 100644
--- a/downloadutil/build.gradle
+++ b/downloadutil/build.gradle
@@ -1,26 +1,26 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 23
- buildToolsVersion "23.0.2"
+ compileSdkVersion 23
+ buildToolsVersion "23.0.2"
- defaultConfig {
- minSdkVersion 9
- targetSdkVersion 23
- versionCode 13
- versionName "1.0.1"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
+ defaultConfig {
+ minSdkVersion 9
+ targetSdkVersion 23
+ versionCode 13
+ versionName "1.0.1"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
+ }
}
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.1.1'
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ testCompile 'junit:junit:4.12'
+ compile 'com.android.support:appcompat-v7:23.1.1'
}
//apply from: 'jcenter.gradle'
\ No newline at end of file
diff --git a/downloadutil/jcenter.gradle b/downloadutil/jcenter.gradle
index c840fa92..50c59b0f 100644
--- a/downloadutil/jcenter.gradle
+++ b/downloadutil/jcenter.gradle
@@ -6,31 +6,31 @@ apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'
task sourcesJar(type: Jar) {
- from android.sourceSets.main.java.srcDirs
- classifier = 'sources'
+ from android.sourceSets.main.java.srcDirs
+ classifier = 'sources'
}
task javadoc(type: Javadoc) {
- options.encoding = "utf-8"
- source = android.sourceSets.main.java.srcDirs
- classpath += configurations.compile
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
+ options.encoding = "utf-8"
+ source = android.sourceSets.main.java.srcDirs
+ classpath += configurations.compile
+ classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from javadoc.destinationDir
+ classifier = 'javadoc'
+ from javadoc.destinationDir
}
javadoc {
- options {
- encoding "UTF-8"
- charSet 'UTF-8'
- author true
- version true
- links "http://docs.oracle.com/javase/7/docs/api"
- title PROJ_ARTIFACTID
- }
+ options {
+ encoding "UTF-8"
+ charSet 'UTF-8'
+ author true
+ version true
+ links "http://docs.oracle.com/javase/7/docs/api"
+ title PROJ_ARTIFACTID
+ }
}
//添加以下信息避免JAVADOC打包时引用其它类库而出现问题,比如出现以下错误
@@ -40,119 +40,121 @@ javadoc {
// 符号: 类 JsonElement
// 位置: 类 xxxx
android.libraryVariants.all { variant ->
- println variant.javaCompile.classpath.files
- if (variant.name == 'release') { //我们只需 release 的 javadoc
- task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
- // title = ''
- // description = ''
- source = variant.javaCompile.source
- classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
- options {
- encoding "utf-8"
- links "http://docs.oracle.com/javase/7/docs/api/"
- linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
- }
- exclude '**/BuildConfig.java'
- exclude '**/R.java'
- }
- task("javadoc${variant.name.capitalize()}Jar", type: Jar, dependsOn: "generate${variant.name.capitalize()}Javadoc") {
- classifier = 'javadoc'
- from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
- }
- artifacts {
- archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
- }
+ println variant.javaCompile.classpath.files
+ if (variant.name == 'release') {
+ //我们只需 release 的 javadoc
+ task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
+ // title = ''
+ // description = ''
+ source = variant.javaCompile.source
+ classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
+ options {
+ encoding "utf-8"
+ links "http://docs.oracle.com/javase/7/docs/api/"
+ linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
+ }
+ exclude '**/BuildConfig.java'
+ exclude '**/R.java'
+ }
+ task("javadoc${variant.name.capitalize()}Jar", type: Jar,
+ dependsOn: "generate${variant.name.capitalize()}Javadoc") {
+ classifier = 'javadoc'
+ from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
+ }
+ artifacts {
+ archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
}
+ }
}
artifacts {
- archives javadocJar
- archives sourcesJar
+ archives javadocJar
+ archives sourcesJar
}
def pomConfig = {
- scm {
- connection PROJ_VCSURL
- developerConnection PROJ_VCSURL
- url PROJ_WEBSITEURL
+ scm {
+ connection PROJ_VCSURL
+ developerConnection PROJ_VCSURL
+ url PROJ_WEBSITEURL
+ }
+ licenses {
+ license {
+ name "The Apache Software License, Version 2.0"
+ url "http://www.apache.org/licenses/LICENSE-2.0.txt"
+ distribution "repo"
}
- licenses {
- license {
- name "The Apache Software License, Version 2.0"
- url "http://www.apache.org/licenses/LICENSE-2.0.txt"
- distribution "repo"
- }
- }
- developers {
- developer {
- id DEVELOPER_ID
- name DEVELOPER_NAME
- email DEVELOPER_EMAIL
- }
+ }
+ developers {
+ developer {
+ id DEVELOPER_ID
+ name DEVELOPER_NAME
+ email DEVELOPER_EMAIL
}
+ }
}
publishing {
- publications {
- mavenJava(MavenPublication) {
- artifactId PROJ_ARTIFACTID
- artifact javadocJar
- artifact sourcesJar
+ publications {
+ mavenJava(MavenPublication) {
+ artifactId PROJ_ARTIFACTID
+ artifact javadocJar
+ artifact sourcesJar
- pom {
- packaging 'aar'
- }
- pom.withXml {
- def root = asNode()
- root.appendNode('description', PROJ_DESCRIPTION)
- root.children().last() + pomConfig
- }
- }
+ pom {
+ packaging 'aar'
+ }
+ pom.withXml {
+ def root = asNode()
+ root.appendNode('description', PROJ_DESCRIPTION)
+ root.children().last() + pomConfig
+ }
}
+ }
}
afterEvaluate {
- publishing.publications.mavenJava.artifact(bundleRelease)
+ publishing.publications.mavenJava.artifact(bundleRelease)
}
bintray {
- user = hasProperty("bintrayUser") ? getProperty("bintrayUser") : getProperty("BINTRAY_USER")
- key = hasProperty("bintrayKey") ? getProperty("bintrayKey") : getProperty("BINTRAY_KEY")
+ user = hasProperty("bintrayUser") ? getProperty("bintrayUser") : getProperty("BINTRAY_USER")
+ key = hasProperty("bintrayKey") ? getProperty("bintrayKey") : getProperty("BINTRAY_KEY")
- configurations = ['archives']
- publications = ['mavenJava']
- publish = true
+ configurations = ['archives']
+ publications = ['mavenJava']
+ publish = true
- pkg {
- repo = 'maven'
- name = PROJ_NAME
- desc = PROJ_DESCRIPTION
- websiteUrl = PROJ_WEBSITEURL
- issueTrackerUrl = PROJ_ISSUETRACKERURL
- vcsUrl = PROJ_VCSURL
- licenses = ['Apache-2.0']
- publicDownloadNumbers = true
- }
+ pkg {
+ repo = 'maven'
+ name = PROJ_NAME
+ desc = PROJ_DESCRIPTION
+ websiteUrl = PROJ_WEBSITEURL
+ issueTrackerUrl = PROJ_ISSUETRACKERURL
+ vcsUrl = PROJ_VCSURL
+ licenses = ['Apache-2.0']
+ publicDownloadNumbers = true
+ }
}
artifactory {
- contextUrl = 'http://oss.jfrog.org/artifactory'
- resolve {
- repository {
- repoKey = 'libs-release'
- }
+ contextUrl = 'http://oss.jfrog.org/artifactory'
+ resolve {
+ repository {
+ repoKey = 'libs-release'
+ }
+ }
+ publish {
+ repository {
+ repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
+ username = bintray.user
+ password = bintray.key
+ maven = true
}
- publish {
- repository {
- repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
- username = bintray.user
- password = bintray.key
- maven = true
- }
- defaults {
- publications('mavenJava')
- publishArtifacts = true
- }
+ defaults {
+ publications('mavenJava')
+ publishArtifacts = true
}
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/androidTest/java/com/arialyy/downloadutil/ApplicationTest.java b/downloadutil/src/androidTest/java/com/arialyy/downloadutil/ApplicationTest.java
index e2c01efd..45a9dd38 100644
--- a/downloadutil/src/androidTest/java/com/arialyy/downloadutil/ApplicationTest.java
+++ b/downloadutil/src/androidTest/java/com/arialyy/downloadutil/ApplicationTest.java
@@ -7,7 +7,7 @@ import android.test.ApplicationTestCase;
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
+ public ApplicationTest() {
+ super(Application.class);
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/main/AndroidManifest.xml b/downloadutil/src/main/AndroidManifest.xml
index 838fc034..7e405fd7 100644
--- a/downloadutil/src/main/AndroidManifest.xml
+++ b/downloadutil/src/main/AndroidManifest.xml
@@ -1,11 +1,11 @@
-
+
-
+
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadCommand.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadCommand.java
deleted file mode 100644
index 97d46921..00000000
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadCommand.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.arialyy.downloadutil.core;
-
-/**
- * Created by lyy on 2016/8/14.
- * 命令抽象类
- */
-public abstract class DownloadCommand {
-
-}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
index 1604b2f1..6ac4258e 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java
@@ -1,70 +1,111 @@
package com.arialyy.downloadutil.core;
import android.content.Context;
+import com.arialyy.downloadutil.core.command.IDownloadCommand;
+import java.util.ArrayList;
+import java.util.List;
/**
* Created by lyy on 2016/8/11.
* 下载管理器,通过命令的方式控制下载
*/
public class DownloadManager {
- /**
- * 下载开始前事件
- */
- public static final String ACTION_PRE = "ACTION_PRE";
-
- /**
- * 开始下载事件
- */
- public static final String ACTION_START = "ACTION_START";
-
- /**
- * 恢复下载事件
- */
- public static final String ACTION_RESUME = "ACTION_RESUME";
-
- /**
- * 正在下载事件
- */
- public static final String ACTION_RUNNING = "ACTION_RUNNING";
-
- /**
- * 停止下载事件
- */
- public static final String ACTION_STOP = "ACTION_STOP";
-
- /**
- * 取消下载事件
- */
- public static final String ACTION_CANCEL = "ACTION_CANCEL";
-
- /**
- * 下载完成事件
- */
- public static final String ACTION_COMPLETE = "ACTION_COMPLETE";
-
- /**
- * 下载失败事件
- */
- public static final String ACTION_FAIL = "ACTION_FAIL";
-
- /**
- * 下载实体
- */
- public static final String DATA = "DOWNLOAD_ENTITY";
-
- /**
- * 位置
- */
- public static final String CURRENT_LOCATION = "CURRENT_LOCATION";
-
- private Context mContext;
-
- private DownloadManager(Context context) {
- mContext = context;
+ private static final Object LOCK = new Object();
+ private static volatile DownloadManager INSTANCE = null;
+ /**
+ * 下载开始前事件
+ */
+ public static final String ACTION_PRE = "ACTION_PRE";
+
+ /**
+ * 开始下载事件
+ */
+ public static final String ACTION_START = "ACTION_START";
+
+ /**
+ * 恢复下载事件
+ */
+ public static final String ACTION_RESUME = "ACTION_RESUME";
+
+ /**
+ * 正在下载事件
+ */
+ public static final String ACTION_RUNNING = "ACTION_RUNNING";
+
+ /**
+ * 停止下载事件
+ */
+ public static final String ACTION_STOP = "ACTION_STOP";
+
+ /**
+ * 取消下载事件
+ */
+ public static final String ACTION_CANCEL = "ACTION_CANCEL";
+
+ /**
+ * 下载完成事件
+ */
+ public static final String ACTION_COMPLETE = "ACTION_COMPLETE";
+
+ /**
+ * 下载失败事件
+ */
+ public static final String ACTION_FAIL = "ACTION_FAIL";
+
+ /**
+ * 下载实体
+ */
+ public static final String DATA = "DOWNLOAD_ENTITY";
+
+ /**
+ * 位置
+ */
+ public static final String CURRENT_LOCATION = "CURRENT_LOCATION";
+
+ private List mCommands = new ArrayList<>();
+
+ private DownloadManager() {
+
+ }
+
+ private Context mContext;
+
+ private DownloadManager(Context context) {
+ mContext = context;
+ }
+
+ public static DownloadManager getInstance(Context context) {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new DownloadManager(context.getApplicationContext());
+ }
}
+ return INSTANCE;
+ }
- public static DownloadManager getInstance(Context context) {
- return new DownloadManager(context);
+ /**
+ * 设置命令
+ */
+ public void setCommant(IDownloadCommand command) {
+ mCommands.add(command);
+ }
+
+ /**
+ * 设置一组命令
+ */
+ public void setCommands(List commands) {
+ if (commands != null && commands.size() > 0) {
+ mCommands.addAll(commands);
}
+ }
+ /**
+ * 执行所有设置的命令
+ */
+ public synchronized void exe() {
+ for (IDownloadCommand command : mCommands) {
+ command.executeComment();
+ }
+ mCommands.clear();
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
index 23110d75..92e1c7a0 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadTarget.java
@@ -1,9 +1,7 @@
package com.arialyy.downloadutil.core;
import android.content.Context;
-import android.text.TextUtils;
import android.util.Log;
-
import com.arialyy.downloadutil.entity.DownloadEntity;
/**
@@ -11,105 +9,96 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
* 下载任务调度类
*/
public class DownloadTarget extends IDownloadTarget {
- private static final String TAG = "DownloadTarget";
- private static final Object LOCK = new Object();
- private static volatile DownloadTarget INSTANCE = null;
- private Context mContext;
+ private static final String TAG = "DownloadTarget";
+ private static final Object LOCK = new Object();
+ private static volatile DownloadTarget INSTANCE = null;
+ private Context mContext;
- public static DownloadTarget getInstance(Context context) {
- if (INSTANCE == null) {
- synchronized (LOCK) {
- INSTANCE = new DownloadTarget(context.getApplicationContext());
- }
- }
- return INSTANCE;
+ public static DownloadTarget getInstance(Context context) {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new DownloadTarget(context.getApplicationContext());
+ }
}
+ return INSTANCE;
+ }
- private DownloadTarget() {
- super();
- }
+ private DownloadTarget() {
+ super();
+ }
- private DownloadTarget(Context context) {
- super();
- mContext = context;
- }
+ private DownloadTarget(Context context) {
+ super();
+ mContext = context;
+ }
- @Override
- public void startTask(Task task) {
- if (mExecutePool.putTask(task)) {
- task.start();
- }
+ @Override public void startTask(Task task) {
+ if (mExecutePool.putTask(task)) {
+ task.start();
}
+ }
- @Override
- public void stopTask(Task task) {
- if (mExecutePool.removeTask(task)) {
- task.stop();
- }
+ @Override public void stopTask(Task task) {
+ if (mExecutePool.removeTask(task)) {
+ task.stop();
}
+ }
- @Override
- public void cancelTask(Task task) {
- if (mExecutePool.removeTask(task)) {
- task.cancel();
- }
+ @Override public void cancelTask(Task task) {
+ if (mExecutePool.removeTask(task)) {
+ task.cancel();
}
+ }
- @Override
- public void reTryStart(Task task) {
- if (!task.getDownloadUtil().isDownloading()) {
- task.start();
- } else {
- Log.w(TAG, "任务没有完全停止,重试下载失败");
- }
+ @Override public void reTryStart(Task task) {
+ if (!task.getDownloadUtil().isDownloading()) {
+ task.start();
+ } else {
+ Log.w(TAG, "任务没有完全停止,重试下载失败");
}
+ }
- @Override
- public Task createTask(DownloadEntity entity) {
- Task task = TaskFactory.getInstance().createTask(mContext, entity, mTaskHandler);
- mCachePool.putTask(task);
- return task;
- }
+ @Override public Task createTask(DownloadEntity entity) {
+ Task task = TaskFactory.getInstance().createTask(mContext, entity, mTaskHandler);
+ mCachePool.putTask(task);
+ return task;
+ }
- @Override
- public Task getTask(DownloadEntity entity) {
- Task task = mExecutePool.getTask(entity.getDownloadUrl());
- if (task == null) {
- task = mCachePool.getTask(entity.getDownloadUrl());
- }
- if (task == null){
- task = createTask(entity);
- }
- return task;
+ @Override public Task getTask(DownloadEntity entity) {
+ Task task = mExecutePool.getTask(entity.getDownloadUrl());
+ if (task == null) {
+ task = mCachePool.getTask(entity.getDownloadUrl());
}
-
- @Override
- public int getTaskState(DownloadEntity entity) {
- Task task = getTask(entity);
- if (task == null) {
- Log.e(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的下载任务");
- return -1;
- }
- return task.getDownloadEntity().getState();
+ if (task == null) {
+ task = createTask(entity);
}
+ return task;
+ }
- @Override
- public void removeTask(DownloadEntity entity) {
- Task task = mCachePool.getTask(entity.getDownloadUrl());
- if (task != null) {
- Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
- } else {
- task = mExecutePool.getTask(entity.getDownloadUrl());
- }
- if (task != null) {
- Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
- } else {
- Log.w(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的任务");
- }
+ @Override public int getTaskState(DownloadEntity entity) {
+ Task task = getTask(entity);
+ if (task == null) {
+ Log.e(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的下载任务");
+ return -1;
}
+ return task.getDownloadEntity().getState();
+ }
- @Override
- public Task getNextTask() {
- return mCachePool.pollTask();
+ @Override public void removeTask(DownloadEntity entity) {
+ Task task = mCachePool.getTask(entity.getDownloadUrl());
+ if (task != null) {
+ Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
+ } else {
+ task = mExecutePool.getTask(entity.getDownloadUrl());
+ }
+ if (task != null) {
+ Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
+ } else {
+ Log.w(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的任务");
}
+ }
+
+ @Override public Task getNextTask() {
+ return mCachePool.pollTask();
+ }
}
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 4f66608d..25dc984c 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/IDownloadTarget.java
@@ -3,7 +3,6 @@ package com.arialyy.downloadutil.core;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
-
import com.arialyy.downloadutil.core.inf.IDownloader;
import com.arialyy.downloadutil.core.inf.ITask;
import com.arialyy.downloadutil.core.pool.CachePool;
@@ -15,217 +14,205 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
* 任务下载器,提供抽象的方法供具体的实现类操作
*/
public abstract class IDownloadTarget implements IDownloader, ITask {
+ /**
+ * 任务开始
+ */
+ public static final int START = 1;
+ /**
+ * 任务停止
+ */
+ public static final int STOP = 2;
+ /**
+ * 任务失败
+ */
+ public static final int FAIL = 3;
+ /**
+ * 任务取消
+ */
+ public static final int CANCEL = 4;
+ /**
+ * 任务完成
+ */
+ public static final int COMPLETE = 5;
+
+ protected CachePool mCachePool = CachePool.getInstance();
+ protected ExecutePool mExecutePool = ExecutePool.getInstance();
+ protected AutoTaskHandler mTaskHandler;
+ /**
+ * 下载失败次数
+ */
+ protected int mFailNum = 10;
+
+ /**
+ * 超时时间
+ */
+ protected long mTimeOut = 10000;
+
+ /**
+ * 下载器任务监听
+ */
+ protected OnTargetListener mTargetListener;
+
+ /**
+ * Target处理任务监听
+ */
+ public interface OnTargetListener {
/**
* 任务开始
*/
- public static final int START = 1;
- /**
- * 任务停止
- */
- public static final int STOP = 2;
- /**
- * 任务失败
- */
- public static final int FAIL = 3;
- /**
- * 任务取消
- */
- public static final int CANCEL = 4;
- /**
- * 任务完成
- */
- public static final int COMPLETE = 5;
+ public void onTaskStart(Task task);
- protected CachePool mCachePool = CachePool.getInstance();
- protected ExecutePool mExecutePool = ExecutePool.getInstance();
- protected AutoTaskHandler mTaskHandler;
/**
- * 下载失败次数
+ * 任务停止
*/
- protected int mFailNum = 10;
+ public void onTaskStop(Task task);
/**
- * 超时时间
+ * 任务取消
*/
- protected long mTimeOut = 10000;
+ public void onTaskCancel(Task task);
/**
- * 下载器任务监听
+ * 任务下载失败
*/
- protected OnTargetListener mTargetListener;
+ public void onTaskFail(Task task);
/**
- * Target处理任务监听
+ * 任务完成
*/
- public interface OnTargetListener {
- /**
- * 任务开始
- *
- * @param task
- */
- public void onTaskStart(Task task);
-
- /**
- * 任务停止
- *
- * @param task
- */
- public void onTaskStop(Task task);
-
- /**
- * 任务取消
- *
- * @param task
- */
- public void onTaskCancel(Task task);
-
- /**
- * 任务下载失败
- *
- * @param task
- */
- public void onTaskFail(Task task);
-
- /**
- * 任务完成
- *
- * @param task
- */
- public void onTaskComplete(Task task);
+ public void onTaskComplete(Task task);
+ }
+
+ protected IDownloadTarget() {
+ mTaskHandler = new AutoTaskHandler(this);
+ }
+
+ /**
+ * 设置下载器监听
+ *
+ * @param targetListener {@link OnTargetListener}
+ */
+ public void setOnTargetListener(OnTargetListener targetListener) {
+ this.mTargetListener = targetListener;
+ }
+
+ /**
+ * 获取当前运行的任务数
+ *
+ * @return 当前正在执行的任务数
+ */
+ public int getCurrentTaskNum() {
+ return mExecutePool.size();
+ }
+
+ /**
+ * 获取缓存任务数
+ *
+ * @return 获取缓存的任务数
+ */
+ public int getCacheTaskNum() {
+ return mCachePool.size();
+ }
+
+ public void setFailNum(int mFailNum) {
+ this.mFailNum = mFailNum;
+ }
+
+ public void setTimeOut(long timeOut) {
+ this.mTimeOut = timeOut;
+ }
+
+ /**
+ * 自动处理任务停止,下载失败,取消下载,自动下载下一个任务的操作
+ */
+ private static class AutoTaskHandler extends Handler {
+ private static final String TAG = "AutoTaskHandler";
+ IDownloadTarget target;
+
+ public AutoTaskHandler(IDownloadTarget target) {
+ this.target = target;
}
- protected IDownloadTarget() {
- mTaskHandler = new AutoTaskHandler(this);
+ @Override public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ DownloadEntity entity = (DownloadEntity) msg.obj;
+ if (entity == null) {
+ Log.e(TAG, "请传入下载实体DownloadEntity");
+ return;
+ }
+ switch (msg.what) {
+ case STOP:
+ startNextTask(entity);
+ break;
+ case CANCEL:
+ startNextTask(entity);
+ break;
+ case COMPLETE:
+ startNextTask(entity);
+ break;
+ case FAIL:
+ handleFailTask(entity);
+ break;
+ }
+ callback(msg.what, entity);
}
/**
- * 设置下载器监听
+ * 回调
*
- * @param targetListener {@link OnTargetListener}
+ * @param state 状态
+ * @param entity 下载实体
*/
- public void setOnTargetListener(OnTargetListener targetListener) {
- this.mTargetListener = targetListener;
+ private void callback(int state, DownloadEntity entity) {
+ if (target.mTargetListener != null) {
+ Task task = target.getTask(entity);
+ switch (state) {
+ case START:
+ target.mTargetListener.onTaskStart(task);
+ break;
+ case STOP:
+ target.mTargetListener.onTaskStop(task);
+ break;
+ case CANCEL:
+ target.mTargetListener.onTaskCancel(task);
+ break;
+ case COMPLETE:
+ target.mTargetListener.onTaskCancel(task);
+ break;
+ case FAIL:
+ target.mTargetListener.onTaskFail(task);
+ break;
+ }
+ }
}
/**
- * 获取当前运行的任务数
+ * 处理下载任务下载失败的情形
*
- * @return 当前正在执行的任务数
+ * @param entity 失败实体
*/
- public int getCurrentTaskNum() {
- return mExecutePool.size();
+ private void handleFailTask(DownloadEntity entity) {
+ if (entity.getFailNum() <= target.mFailNum) {
+ Task task = target.getTask(entity);
+ target.reTryStart(task);
+ } else {
+ startNextTask(entity);
+ }
}
/**
- * 获取缓存任务数
+ * 启动下一个任务,条件:任务停止,取消下载,任务完成
*
- * @return 获取缓存的任务数
+ * @param entity 通过Handler传递的下载实体
*/
- public int getCacheTaskNum() {
- return mCachePool.size();
- }
-
- public void setFailNum(int mFailNum) {
- this.mFailNum = mFailNum;
+ private void startNextTask(DownloadEntity entity) {
+ target.removeTask(entity);
+ Task newTask = target.getNextTask();
+ if (newTask == null) {
+ Log.e(TAG, "没有下一任务");
+ return;
+ }
+ target.startTask(newTask);
}
-
- public void setTimeOut(long timeOut) {
- this.mTimeOut = timeOut;
- }
-
- /**
- * 自动处理任务停止,下载失败,取消下载,自动下载下一个任务的操作
- */
- private static class AutoTaskHandler extends Handler {
- private static final String TAG = "AutoTaskHandler";
- IDownloadTarget target;
-
- public AutoTaskHandler(IDownloadTarget target) {
- this.target = target;
- }
-
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- DownloadEntity entity = (DownloadEntity) msg.obj;
- if (entity == null) {
- Log.e(TAG, "请传入下载实体DownloadEntity");
- return;
- }
- switch (msg.what) {
- case STOP:
- startNextTask(entity);
- break;
- case CANCEL:
- startNextTask(entity);
- break;
- case COMPLETE:
- startNextTask(entity);
- break;
- case FAIL:
- handleFailTask(entity);
- break;
- }
- callback(msg.what, entity);
- }
-
- /**
- * 回调
- *
- * @param state 状态
- * @param entity 下载实体
- */
- private void callback(int state, DownloadEntity entity) {
- if (target.mTargetListener != null) {
- Task task = target.getTask(entity);
- switch (state) {
- case START:
- target.mTargetListener.onTaskStart(task);
- break;
- case STOP:
- target.mTargetListener.onTaskStop(task);
- break;
- case CANCEL:
- target.mTargetListener.onTaskCancel(task);
- break;
- case COMPLETE:
- target.mTargetListener.onTaskCancel(task);
- break;
- case FAIL:
- target.mTargetListener.onTaskFail(task);
- break;
- }
- }
- }
-
- /**
- * 处理下载任务下载失败的情形
- *
- * @param entity 失败实体
- */
- private void handleFailTask(DownloadEntity entity) {
- if (entity.getFailNum() <= target.mFailNum) {
- Task task = target.getTask(entity);
- target.reTryStart(task);
- } else {
- startNextTask(entity);
- }
- }
-
- /**
- * 启动下一个任务,条件:任务停止,取消下载,任务完成
- *
- * @param entity 通过Handler传递的下载实体
- */
- private void startNextTask(DownloadEntity entity) {
- target.removeTask(entity);
- Task newTask = target.getNextTask();
- if (newTask == null) {
- Log.e(TAG, "没有下一任务");
- return;
- }
- target.startTask(newTask);
- }
- }
-
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
index afaafd14..66ca16a0 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Task.java
@@ -4,11 +4,9 @@ import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.util.Log;
-
import com.arialyy.downloadutil.entity.DownloadEntity;
-import com.arialyy.downloadutil.util.IDownloadListener;
import com.arialyy.downloadutil.util.DownLoadUtil;
-
+import com.arialyy.downloadutil.util.IDownloadListener;
import java.net.HttpURLConnection;
/**
@@ -16,197 +14,189 @@ import java.net.HttpURLConnection;
* 下载任务类
*/
public class Task {
- public static final String TAG = "Task";
+ public static final String TAG = "Task";
+
+ private DownloadEntity downloadEntity;
+ private IDownloadListener listener;
+ private Handler outHandler;
+ private Context context;
+ private DownLoadUtil util;
+
+ private Task() {
+ util = new DownLoadUtil();
+ }
+
+ /**
+ * 开始下载
+ */
+ public void start() {
+ if (util.isDownloading()) {
+ Log.d(TAG, "任务正在下载");
+ } else {
+ if (listener == null) {
+ listener = new DownloadListener(context, downloadEntity, outHandler);
+ }
+ util.download(context, downloadEntity.getDownloadUrl(), downloadEntity.getDownloadPath(),
+ listener);
+ }
+ }
+
+ public DownloadEntity getDownloadEntity() {
+ return downloadEntity;
+ }
+
+ /**
+ * 停止下载
+ */
+ public void stop() {
+ if (util.isDownloading()) {
+ util.stopDownload();
+ }
+ }
+
+ /**
+ * 获取下载工具
+ */
+ public DownLoadUtil getDownloadUtil() {
+ return util;
+ }
+
+ /**
+ * 取消下载
+ */
+ public void cancel() {
+ util.cancelDownload();
+ }
+
+ /**
+ * 下载监听类
+ */
+ private static class DownloadListener extends DownLoadUtil.DownloadListener {
+ Handler outHandler;
+ Context context;
+ Intent sendIntent;
+ long INTERVAL = 1024 * 10; //10k大小的间隔
+ long lastLen = 0; //上一次发送长度
+ DownloadEntity downloadEntity;
+
+ public DownloadListener(Context context, DownloadEntity downloadEntity, Handler outHandler) {
+ this.context = context;
+ this.outHandler = outHandler;
+ this.downloadEntity = downloadEntity;
+ sendIntent = new Intent();
+ sendIntent.addCategory(context.getPackageName());
+ }
- private DownloadEntity downloadEntity;
- private IDownloadListener listener;
- private Handler outHandler;
- private Context context;
- private DownLoadUtil util;
+ @Override public void onPreDownload(HttpURLConnection connection) {
+ super.onPreDownload(connection);
+ long len = connection.getContentLength();
+ downloadEntity.setFileSize(len);
+ downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
+ sendIntent(DownloadManager.ACTION_PRE, -1);
+ }
- private Task() {
- util = new DownLoadUtil();
+ @Override public void onResume(long resumeLocation) {
+ super.onResume(resumeLocation);
+ downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
+ sendIntent(DownloadManager.ACTION_RESUME, resumeLocation);
}
- /**
- * 开始下载
- */
- public void start() {
- if (util.isDownloading()) {
- Log.d(TAG, "任务正在下载");
- } else {
- if (listener == null) {
- listener = new DownloadListener(context, downloadEntity, outHandler);
- }
- util.download(context, downloadEntity.getDownloadUrl(), downloadEntity.getDownloadPath(), listener);
- }
+ @Override public void onStart(long startLocation) {
+ super.onStart(startLocation);
+ downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
+ sendInState2Target(IDownloadTarget.START);
+ sendIntent(DownloadManager.ACTION_START, startLocation);
}
- public DownloadEntity getDownloadEntity() {
- return downloadEntity;
+ @Override public void onProgress(long currentLocation) {
+ super.onProgress(currentLocation);
+ if (currentLocation - lastLen > INTERVAL) { //不要太过于频繁发送广播
+ sendIntent.putExtra(DownloadManager.ACTION_RUNNING, currentLocation);
+ lastLen = currentLocation;
+ }
}
- /**
- * 停止下载
- */
- public void stop() {
- if (util.isDownloading()) {
- util.stopDownload();
- }
+ @Override public void onStop(long stopLocation) {
+ super.onStop(stopLocation);
+ downloadEntity.setState(DownloadEntity.STATE_STOP);
+ sendInState2Target(IDownloadTarget.STOP);
+ sendIntent(DownloadManager.ACTION_STOP, stopLocation);
}
- /**
- * 获取下载工具
- */
- public DownLoadUtil getDownloadUtil() {
- return util;
+ @Override public void onCancel() {
+ super.onCancel();
+ downloadEntity.setState(DownloadEntity.STATE_CANCEL);
+ sendInState2Target(IDownloadTarget.CANCEL);
+ sendIntent(DownloadManager.ACTION_CANCEL, -1);
+ downloadEntity.deleteData();
}
- /**
- * 取消下载
- */
- public void cancel() {
- util.cancelDownload();
+ @Override public void onComplete() {
+ super.onComplete();
+ downloadEntity.setState(DownloadEntity.STATE_COMPLETE);
+ downloadEntity.setDownloadComplete(true);
+ sendInState2Target(IDownloadTarget.COMPLETE);
+ sendIntent(DownloadManager.ACTION_COMPLETE, -1);
+ }
+
+ @Override public void onFail() {
+ super.onFail();
+ downloadEntity.setState(DownloadEntity.STATE_FAIL);
+ sendInState2Target(IDownloadTarget.FAIL);
+ sendIntent(DownloadManager.ACTION_FAIL, -1);
}
/**
- * 下载监听类
+ * 将任务状态发送给下载器
+ *
+ * @param state {@link IDownloadTarget#START}
*/
- private static class DownloadListener extends DownLoadUtil.DownloadListener {
- Handler outHandler;
- Context context;
- Intent sendIntent;
- long INTERVAL = 1024 * 10; //10k大小的间隔
- long lastLen = 0; //上一次发送长度
- DownloadEntity downloadEntity;
-
- public DownloadListener(Context context, DownloadEntity downloadEntity, Handler outHandler) {
- this.context = context;
- this.outHandler = outHandler;
- this.downloadEntity = downloadEntity;
- sendIntent = new Intent();
- sendIntent.addCategory(context.getPackageName());
- }
-
- @Override
- public void onPreDownload(HttpURLConnection connection) {
- super.onPreDownload(connection);
- long len = connection.getContentLength();
- downloadEntity.setFileSize(len);
- downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
- sendIntent(DownloadManager.ACTION_PRE, -1);
- }
-
- @Override
- public void onResume(long resumeLocation) {
- super.onResume(resumeLocation);
- downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
- sendIntent(DownloadManager.ACTION_RESUME, resumeLocation);
- }
-
- @Override
- public void onStart(long startLocation) {
- super.onStart(startLocation);
- downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING);
- sendInState2Target(IDownloadTarget.START);
- sendIntent(DownloadManager.ACTION_START, startLocation);
- }
-
- @Override
- public void onProgress(long currentLocation) {
- super.onProgress(currentLocation);
- if (currentLocation - lastLen > INTERVAL) { //不要太过于频繁发送广播
- sendIntent.putExtra(DownloadManager.ACTION_RUNNING, currentLocation);
- lastLen = currentLocation;
- }
- }
-
- @Override
- public void onStop(long stopLocation) {
- super.onStop(stopLocation);
- downloadEntity.setState(DownloadEntity.STATE_STOP);
- sendInState2Target(IDownloadTarget.STOP);
- sendIntent(DownloadManager.ACTION_STOP, stopLocation);
- }
-
- @Override
- public void onCancel() {
- super.onCancel();
- downloadEntity.setState(DownloadEntity.STATE_CANCEL);
- sendInState2Target(IDownloadTarget.CANCEL);
- sendIntent(DownloadManager.ACTION_CANCEL, -1);
- downloadEntity.deleteData();
- }
-
- @Override
- public void onComplete() {
- super.onComplete();
- downloadEntity.setState(DownloadEntity.STATE_COMPLETE);
- downloadEntity.setDownloadComplete(true);
- sendInState2Target(IDownloadTarget.COMPLETE);
- sendIntent(DownloadManager.ACTION_COMPLETE, -1);
- }
-
- @Override
- public void onFail() {
- super.onFail();
- downloadEntity.setState(DownloadEntity.STATE_FAIL);
- sendInState2Target(IDownloadTarget.FAIL);
- sendIntent(DownloadManager.ACTION_FAIL, -1);
- }
-
- /**
- * 将任务状态发送给下载器
- *
- * @param state {@link IDownloadTarget#START}
- */
- private void sendInState2Target(int state) {
- if (outHandler != null) {
- outHandler.obtainMessage(state, downloadEntity).sendToTarget();
- }
- }
-
- private void sendIntent(String action, long location) {
- downloadEntity.save();
- Intent intent = new Intent();
- intent.addCategory(context.getPackageName());
- intent.putExtra(action, downloadEntity);
- if (location != -1) {
- intent.putExtra(DownloadManager.CURRENT_LOCATION, location);
- }
- context.sendBroadcast(intent);
- }
- }
-
- public static class Builder {
- DownloadEntity downloadEntity;
- IDownloadListener listener;
- Handler outHandler;
- Context context;
-
- public Builder(Context context, DownloadEntity downloadEntity) {
- this.context = context;
- this.downloadEntity = downloadEntity;
- }
-
- public Builder setDownloadListener(IDownloadListener listener) {
- this.listener = listener;
- return this;
- }
-
- public Builder setOutHandler(Handler outHandler) {
- this.outHandler = outHandler;
- return this;
- }
-
- public Task builder() {
- Task task = new Task();
- task.context = context;
- task.downloadEntity = downloadEntity;
- task.listener = listener;
- task.outHandler = outHandler;
- return task;
- }
+ private void sendInState2Target(int state) {
+ if (outHandler != null) {
+ outHandler.obtainMessage(state, downloadEntity).sendToTarget();
+ }
+ }
+
+ private void sendIntent(String action, long location) {
+ downloadEntity.save();
+ Intent intent = new Intent();
+ intent.addCategory(context.getPackageName());
+ intent.putExtra(action, downloadEntity);
+ if (location != -1) {
+ intent.putExtra(DownloadManager.CURRENT_LOCATION, location);
+ }
+ context.sendBroadcast(intent);
+ }
+ }
+
+ public static class Builder {
+ DownloadEntity downloadEntity;
+ IDownloadListener listener;
+ Handler outHandler;
+ Context context;
+
+ public Builder(Context context, DownloadEntity downloadEntity) {
+ this.context = context;
+ this.downloadEntity = downloadEntity;
+ }
+
+ public Builder setDownloadListener(IDownloadListener listener) {
+ this.listener = listener;
+ return this;
}
+ public Builder setOutHandler(Handler outHandler) {
+ this.outHandler = outHandler;
+ return this;
+ }
+
+ public Task builder() {
+ Task task = new Task();
+ task.context = context;
+ task.downloadEntity = downloadEntity;
+ task.listener = listener;
+ task.outHandler = outHandler;
+ return task;
+ }
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskEnum.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskEnum.java
index d6e52c2f..4e5c9790 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskEnum.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskEnum.java
@@ -5,5 +5,5 @@ package com.arialyy.downloadutil.core;
* 创建任务类型
*/
public enum TaskEnum {
- ORDINARY, NO_USR_CALLBACK
+ ORDINARY, NO_USR_CALLBACK
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskFactory.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskFactory.java
index 25e7680c..1fc9e84c 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskFactory.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/TaskFactory.java
@@ -2,7 +2,6 @@ package com.arialyy.downloadutil.core;
import android.content.Context;
import android.os.Handler;
-
import com.arialyy.downloadutil.entity.DownloadEntity;
/**
@@ -10,35 +9,33 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
* 任务工厂
*/
public class TaskFactory {
- private static final String TAG = "TaskFactory";
+ private static final String TAG = "TaskFactory";
- private static final Object LOCK = new Object();
- private static volatile TaskFactory INSTANCE = null;
+ private static final Object LOCK = new Object();
+ private static volatile TaskFactory INSTANCE = null;
- private TaskFactory() {
+ private TaskFactory() {
- }
+ }
- public static TaskFactory getInstance() {
- if (INSTANCE == null) {
- synchronized (LOCK) {
- INSTANCE = new TaskFactory();
- }
- }
- return INSTANCE;
+ public static TaskFactory getInstance() {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new TaskFactory();
+ }
}
-
- /**
- * 创建普通下载任务
- * @param context
- * @param entity 下载实体
- * @param handler {@link com.arialyy.downloadutil.core.IDownloadTarget.AutoTaskHandler}
- * @return
- */
- public Task createTask(Context context, DownloadEntity entity, Handler handler) {
- Task.Builder builder = new Task.Builder(context, entity);
- builder.setOutHandler(handler);
- return builder.builder();
- }
-
+ return INSTANCE;
+ }
+
+ /**
+ * 创建普通下载任务
+ *
+ * @param entity 下载实体
+ * @param handler {@link com.arialyy.downloadutil.core.IDownloadTarget.AutoTaskHandler}
+ */
+ public Task createTask(Context context, DownloadEntity entity, Handler handler) {
+ Task.Builder builder = new Task.Builder(context, entity);
+ builder.setOutHandler(handler);
+ return builder.builder();
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/AddCommand.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/AddCommand.java
index af6a5b96..91a5aa98 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/AddCommand.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/AddCommand.java
@@ -9,12 +9,11 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
*/
class AddCommand extends IDownloadCommand {
- AddCommand(Context context, DownloadEntity entity) {
- super(context, entity);
- }
+ AddCommand(Context context, DownloadEntity entity) {
+ super(context, entity);
+ }
- @Override
- public void executeComment() {
- target.createTask(mEntity);
- }
+ @Override public void executeComment() {
+ target.createTask(mEntity);
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
index 0e61be8f..087f52c4 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/IDownloadCommand.java
@@ -1,54 +1,48 @@
package com.arialyy.downloadutil.core.command;
import android.content.Context;
-import android.support.annotation.NonNull;
-
import com.arialyy.downloadutil.core.DownloadTarget;
import com.arialyy.downloadutil.core.IDownloadTarget;
-
import com.arialyy.downloadutil.entity.DownloadEntity;
import com.arialyy.downloadutil.help.CheckHelp;
-import java.util.List;
/**
* Created by lyy on 2016/8/22.
* 下载命令
*/
public abstract class IDownloadCommand {
- protected IDownloadTarget target;
- protected Context mContext;
- protected DownloadEntity mEntity;
-
- /**
- * @param context context
- * @param entity 下载实体
- */
- protected IDownloadCommand(Context context, DownloadEntity entity){
- if (!CheckHelp.checkDownloadEntity(entity)){
- return;
- }
- target = DownloadTarget.getInstance(context);
- mContext = context;
- mEntity = entity;
- }
-
- public Context getContext(){
- return mContext;
+ protected IDownloadTarget target;
+ protected Context mContext;
+ protected DownloadEntity mEntity;
+
+ /**
+ * @param context context
+ * @param entity 下载实体
+ */
+ protected IDownloadCommand(Context context, DownloadEntity entity) {
+ if (!CheckHelp.checkDownloadEntity(entity)) {
+ return;
}
-
- /**
- * 执行命令
- */
- public abstract void executeComment();
-
- /**
- * 设置下载器
- *
- * @param downloadTarget {@link IDownloadTarget}
- */
- public void setDownloadTarget(IDownloadTarget downloadTarget) {
- target = downloadTarget;
- }
-
-
+ target = DownloadTarget.getInstance(context);
+ mContext = context;
+ mEntity = entity;
+ }
+
+ public Context getContext() {
+ return mContext;
+ }
+
+ /**
+ * 执行命令
+ */
+ public abstract void executeComment();
+
+ /**
+ * 设置下载器
+ *
+ * @param downloadTarget {@link IDownloadTarget}
+ */
+ public void setDownloadTarget(IDownloadTarget downloadTarget) {
+ target = downloadTarget;
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/StartCommand.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/StartCommand.java
index db2c23b0..c3e6ff49 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/StartCommand.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/command/StartCommand.java
@@ -7,14 +7,13 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
* Created by lyy on 2016/8/22.
* 开始命令
*/
-class StartCommand extends IDownloadCommand{
+class StartCommand extends IDownloadCommand {
- StartCommand(Context context, DownloadEntity entity) {
- super(context, entity);
- }
+ StartCommand(Context context, DownloadEntity entity) {
+ super(context, entity);
+ }
- @Override
- public void executeComment() {
- target.startTask(target.getTask(mEntity));
- }
+ @Override public void executeComment() {
+ target.startTask(target.getTask(mEntity));
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IDownloader.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IDownloader.java
index d6812de3..fc8e0d8e 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IDownloader.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IDownloader.java
@@ -7,32 +7,31 @@ import com.arialyy.downloadutil.core.Task;
* 下载功能接口
*/
public interface IDownloader {
- /**
- * 开始任务
- *
- * @param task {@link Task}
- */
- public void startTask(Task task);
+ /**
+ * 开始任务
+ *
+ * @param task {@link Task}
+ */
+ public void startTask(Task task);
- /**
- * 停止任务
- *
- * @param task {@link Task}
- */
- public void stopTask(Task task);
+ /**
+ * 停止任务
+ *
+ * @param task {@link Task}
+ */
+ public void stopTask(Task task);
- /**
- * 取消任务
- *
- * @param task {@link Task}
- */
- public void cancelTask(Task task);
-
- /**
- * 重试下载
- *
- * @param task {@link Task}
- */
- public void reTryStart(Task task);
+ /**
+ * 取消任务
+ *
+ * @param task {@link Task}
+ */
+ public void cancelTask(Task task);
+ /**
+ * 重试下载
+ *
+ * @param task {@link Task}
+ */
+ public void reTryStart(Task task);
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IPool.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IPool.java
index 58efda4f..6b83219e 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IPool.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/IPool.java
@@ -7,48 +7,46 @@ import com.arialyy.downloadutil.core.Task;
* 任务池
*/
public interface IPool {
- /**
- * 将下载任务添加到任务池中
- *
- * @param task
- */
- public boolean putTask(Task task);
+ /**
+ * 将下载任务添加到任务池中
+ */
+ public boolean putTask(Task task);
- /**
- * 按照队列原则取出下载任务
- *
- * @return 返回null或者下载任务
- */
- public Task pollTask();
+ /**
+ * 按照队列原则取出下载任务
+ *
+ * @return 返回null或者下载任务
+ */
+ public Task pollTask();
- /**
- * 通过下载链接获取下载任务,当任务不为空时,队列将删除该下载任务
- *
- * @param downloadUrl 下载链接
- * @return 返回null或者下载任务
- */
- public Task getTask(String downloadUrl);
+ /**
+ * 通过下载链接获取下载任务,当任务不为空时,队列将删除该下载任务
+ *
+ * @param downloadUrl 下载链接
+ * @return 返回null或者下载任务
+ */
+ public Task getTask(String downloadUrl);
- /**
- * 删除任务池中的下载任务
- *
- * @param task 下载任务
- * @return true:移除成功
- */
- public boolean removeTask(Task task);
+ /**
+ * 删除任务池中的下载任务
+ *
+ * @param task 下载任务
+ * @return true:移除成功
+ */
+ public boolean removeTask(Task task);
- /**
- * 通过下载链接移除下载任务
- *
- * @param downloadUrl 下载链接
- * @return true:移除成功
- */
- public boolean removeTask(String downloadUrl);
+ /**
+ * 通过下载链接移除下载任务
+ *
+ * @param downloadUrl 下载链接
+ * @return true:移除成功
+ */
+ public boolean removeTask(String downloadUrl);
- /**
- * 池子大小
- *
- * @return 返回缓存池或者当前任务池大小
- */
- public int size();
+ /**
+ * 池子大小
+ *
+ * @return 返回缓存池或者当前任务池大小
+ */
+ public int size();
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/ITask.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/ITask.java
index 241443f8..a29c6768 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/ITask.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/inf/ITask.java
@@ -9,41 +9,41 @@ import com.arialyy.downloadutil.entity.DownloadEntity;
*/
public interface ITask {
- /**
- * 创建一个新的下载任务,创建时只是将新任务存储到缓存池
- *
- * @param entity 下载实体{@link DownloadEntity}
- * @return {@link Task}
- */
- public Task createTask(DownloadEntity entity);
-
- /**
- * 通过下载链接从缓存池或任务池搜索下载任务,如果缓存池或任务池都没有任务,则创建新任务
- *
- * @param entity 下载实体{@link DownloadEntity}
- * @return {@link Task}
- */
- public Task getTask(DownloadEntity entity);
-
- /**
- * 通过下载链接搜索下载任务
- *
- * @param entity 下载实体{@link DownloadEntity}
- * @return {@code -1 ==> 错误},{@link com.arialyy.downloadutil.entity.DownloadEntity#STATE_FAIL}
- */
- public int getTaskState(DownloadEntity entity);
-
- /**
- * 通过下载链接删除任务
- * @param entity 下载实体{@link DownloadEntity}
- */
- public void removeTask(DownloadEntity entity);
-
- /**
- * 获取缓存池的下一个任务
- *
- * @return 下载任务 or null
- */
- public Task getNextTask();
-
+ /**
+ * 创建一个新的下载任务,创建时只是将新任务存储到缓存池
+ *
+ * @param entity 下载实体{@link DownloadEntity}
+ * @return {@link Task}
+ */
+ public Task createTask(DownloadEntity entity);
+
+ /**
+ * 通过下载链接从缓存池或任务池搜索下载任务,如果缓存池或任务池都没有任务,则创建新任务
+ *
+ * @param entity 下载实体{@link DownloadEntity}
+ * @return {@link Task}
+ */
+ public Task getTask(DownloadEntity entity);
+
+ /**
+ * 通过下载链接搜索下载任务
+ *
+ * @param entity 下载实体{@link DownloadEntity}
+ * @return {@code -1 ==> 错误},{@link com.arialyy.downloadutil.entity.DownloadEntity#STATE_FAIL}
+ */
+ public int getTaskState(DownloadEntity entity);
+
+ /**
+ * 通过下载链接删除任务
+ *
+ * @param entity 下载实体{@link DownloadEntity}
+ */
+ public void removeTask(DownloadEntity entity);
+
+ /**
+ * 获取缓存池的下一个任务
+ *
+ * @return 下载任务 or null
+ */
+ public Task getNextTask();
}
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 aab9ef72..cacc53e1 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
@@ -2,11 +2,9 @@ package com.arialyy.downloadutil.core.pool;
import android.text.TextUtils;
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.PriorityQueue;
@@ -17,102 +15,96 @@ import java.util.Queue;
* 任务缓存池,所有下载任务最先缓存在这个池中
*/
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 volatile CachePool INSTANCE = null;
+ private Map mCacheArray;
+ private Queue mCacheQueue;
- public static CachePool getInstance() {
- if (INSTANCE == null) {
- synchronized (LOCK) {
- INSTANCE = new CachePool();
- }
- }
- return INSTANCE;
+ public static CachePool getInstance() {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new CachePool();
+ }
}
+ return INSTANCE;
+ }
- private CachePool() {
- mCacheQueue = new PriorityQueue<>();
- mCacheArray = new HashMap<>();
- }
+ private CachePool() {
+ mCacheQueue = new PriorityQueue<>();
+ mCacheArray = new HashMap<>();
+ }
- @Override
- 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 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 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
- public Task getTask(String downloadUrl) {
- synchronized (LOCK) {
- if (TextUtils.isEmpty(downloadUrl)) {
- Log.e(TAG, "请传入有效的下载链接");
- return null;
- }
- String key = Util.keyToHashKey(downloadUrl);
- return mCacheArray.get(key);
- }
+ @Override public Task getTask(String downloadUrl) {
+ synchronized (LOCK) {
+ if (TextUtils.isEmpty(downloadUrl)) {
+ Log.e(TAG, "请传入有效的下载链接");
+ return null;
+ }
+ String key = Util.keyToHashKey(downloadUrl);
+ return mCacheArray.get(key);
}
+ }
- @Override
- public boolean removeTask(Task task) {
- 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);
- }
- }
+ @Override public boolean removeTask(Task task) {
+ 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);
+ }
}
+ }
- @Override
- public boolean removeTask(String downloadUrl) {
- synchronized (LOCK) {
- if (TextUtils.isEmpty(downloadUrl)) {
- Log.e(TAG, "请传入有效的下载链接");
- return false;
- }
- String key = Util.keyToHashKey(downloadUrl);
- Task task = mCacheArray.get(key);
- mCacheArray.remove(key);
- return mCacheQueue.remove(task);
- }
+ @Override public boolean removeTask(String downloadUrl) {
+ synchronized (LOCK) {
+ if (TextUtils.isEmpty(downloadUrl)) {
+ Log.e(TAG, "请传入有效的下载链接");
+ return false;
+ }
+ String key = Util.keyToHashKey(downloadUrl);
+ Task task = mCacheArray.get(key);
+ mCacheArray.remove(key);
+ return mCacheQueue.remove(task);
}
+ }
- @Override
- public int size() {
- return mCacheQueue.size();
- }
+ @Override public int size() {
+ return mCacheQueue.size();
+ }
}
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 7a8789e9..2b3fdefa 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
@@ -2,11 +2,9 @@ package com.arialyy.downloadutil.core.pool;
import android.text.TextUtils;
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;
@@ -17,144 +15,137 @@ import java.util.concurrent.TimeUnit;
* 任务执行池,所有当前下载任务都该任务池中,默认下载大小为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 mExecuteQueue;
- private Map mExecuteArray;
+ 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 mExecuteQueue;
+ private Map mExecuteArray;
- public static ExecutePool getInstance() {
- if (INSTANCE == null) {
- synchronized (LOCK) {
- INSTANCE = new ExecutePool();
- }
- }
- return INSTANCE;
+ public static ExecutePool getInstance() {
+ if (INSTANCE == null) {
+ synchronized (LOCK) {
+ INSTANCE = new ExecutePool();
+ }
}
+ return INSTANCE;
+ }
- private ExecutePool() {
- mExecuteQueue = new ArrayBlockingQueue<>(SIZE);
- mExecuteArray = new HashMap<>();
- }
+ 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);
- }
- }
- }
+ @Override public boolean putTask(Task task) {
+ synchronized (LOCK) {
+ if (task == null) {
+ Log.e(TAG, "下载任务不能为空!!");
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);
+ }
+ 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 s;
+ }
}
+ return false;
+ }
- /**
- * 队列满时,将移除下载队列中的第一个任务
- */
- 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;
+ /**
+ * 添加新任务
+ *
+ * @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;
+ }
- @Override
- public Task pollTask() {
- synchronized (LOCK) {
- Task task = mExecuteQueue.poll();
- if (task != null) {
- String url = task.getDownloadEntity().getDownloadUrl();
- mExecuteArray.remove(Util.keyToHashKey(url));
- }
- return task;
- }
+ /**
+ * 队列满时,将移除下载队列中的第一个任务
+ */
+ 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 getTask(String downloadUrl) {
- synchronized (LOCK) {
- if (TextUtils.isEmpty(downloadUrl)) {
- Log.e(TAG, "请传入有效的下载链接");
- return null;
- }
- String key = Util.keyToHashKey(downloadUrl);
- return mExecuteArray.get(key);
- }
+ @Override public Task pollTask() {
+ synchronized (LOCK) {
+ Task task = mExecuteQueue.poll();
+ if (task != null) {
+ String url = task.getDownloadEntity().getDownloadUrl();
+ mExecuteArray.remove(Util.keyToHashKey(url));
+ }
+ return task;
}
+ }
- @Override
- public boolean removeTask(Task task) {
- synchronized (LOCK) {
- if (task == null) {
- Log.e(TAG, "任务不能为空");
- return false;
- } else {
- String key = Util.keyToHashKey(task.getDownloadEntity().getDownloadUrl());
- mExecuteArray.remove(key);
- return mExecuteQueue.remove(task);
- }
- }
+ @Override public Task getTask(String downloadUrl) {
+ synchronized (LOCK) {
+ if (TextUtils.isEmpty(downloadUrl)) {
+ Log.e(TAG, "请传入有效的下载链接");
+ return null;
+ }
+ String key = Util.keyToHashKey(downloadUrl);
+ return mExecuteArray.get(key);
}
+ }
- @Override
- public boolean removeTask(String downloadUrl) {
- synchronized (LOCK) {
- if (TextUtils.isEmpty(downloadUrl)) {
- Log.e(TAG, "请传入有效的下载链接");
- return false;
- }
- String key = Util.keyToHashKey(downloadUrl);
- Task task = mExecuteArray.get(key);
- mExecuteArray.remove(key);
- return mExecuteQueue.remove(task);
- }
+ @Override public boolean removeTask(Task task) {
+ synchronized (LOCK) {
+ if (task == null) {
+ Log.e(TAG, "任务不能为空");
+ return false;
+ } else {
+ String key = Util.keyToHashKey(task.getDownloadEntity().getDownloadUrl());
+ mExecuteArray.remove(key);
+ return mExecuteQueue.remove(task);
+ }
}
+ }
- @Override
- public int size() {
- return mExecuteQueue.size();
+ @Override public boolean removeTask(String downloadUrl) {
+ synchronized (LOCK) {
+ if (TextUtils.isEmpty(downloadUrl)) {
+ Log.e(TAG, "请传入有效的下载链接");
+ return false;
+ }
+ String key = Util.keyToHashKey(downloadUrl);
+ Task task = mExecuteArray.get(key);
+ mExecuteArray.remove(key);
+ return mExecuteQueue.remove(task);
}
+ }
+ @Override public int size() {
+ return mExecuteQueue.size();
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java b/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
index 664a3537..51a3c925 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/entity/DownloadEntity.java
@@ -2,7 +2,6 @@ package com.arialyy.downloadutil.entity;
import android.os.Parcel;
import android.os.Parcelable;
-
import com.arialyy.downloadutil.orm.DbEntity;
/**
@@ -10,186 +9,179 @@ import com.arialyy.downloadutil.orm.DbEntity;
* 下载实体
*/
public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
- /**
- * 其它状态
- */
- public static final int STATE_OTHER = -1;
- /**
- * 失败状态
- */
- public static final int STATE_FAIL = 0;
- /**
- * 完成状态
- */
- public static final int STATE_COMPLETE = 1;
- /**
- * 停止状态
- */
- public static final int STATE_STOP = 2;
- /**
- * 未开始状态
- */
- public static final int STATE_WAIT = 3;
- /**
- * 下载中
- */
- public static final int STATE_DOWNLOAD_ING = 4;
- /**
- * 取消下载
- */
- public static final int STATE_CANCEL = 5;
-
- private String downloadUrl; //下载路径
- private String downloadPath; //保存路径
- private String fileName; //文件名
- private String str; //其它字段
- private long completeTime; //完成时间
- private long fileSize = 1;
- private int state = STATE_WAIT;
- private boolean isDownloadComplete = false; //是否下载完成
- private long currentProgress = 0; //当前下载进度
- private int failNum = 0;
-
- public String getStr() {
- return str;
- }
-
- public void setStr(String str) {
- this.str = str;
- }
-
- public String getFileName() {
- return fileName;
- }
-
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
-
- public int getFailNum() {
- return failNum;
- }
-
- public void setFailNum(int failNum) {
- this.failNum = failNum;
- }
-
- public String getDownloadUrl() {
- return downloadUrl;
- }
-
- public long getCompleteTime() {
- return completeTime;
- }
-
- public void setCompleteTime(long completeTime) {
- this.completeTime = completeTime;
- }
-
- public void setDownloadUrl(String downloadUrl) {
- this.downloadUrl = downloadUrl;
- }
-
- public String getDownloadPath() {
- return downloadPath;
- }
-
- public void setDownloadPath(String downloadPath) {
- this.downloadPath = downloadPath;
- }
-
- public long getFileSize() {
- return fileSize;
- }
-
- public void setFileSize(long fileSize) {
- this.fileSize = fileSize;
- }
-
- public int getState() {
- return state;
- }
-
- public void setState(int state) {
- this.state = state;
- }
-
- public boolean isDownloadComplete() {
- return isDownloadComplete;
- }
-
- public void setDownloadComplete(boolean downloadComplete) {
- isDownloadComplete = downloadComplete;
- }
-
- public long getCurrentProgress() {
- return currentProgress;
- }
-
- public void setCurrentProgress(long currentProgress) {
- this.currentProgress = currentProgress;
- }
-
- @Override
- public DownloadEntity clone() throws CloneNotSupportedException {
- return (DownloadEntity) super.clone();
- }
-
-
- public DownloadEntity() {
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(this.downloadUrl);
- dest.writeString(this.downloadPath);
- dest.writeLong(this.completeTime);
- dest.writeLong(this.fileSize);
- dest.writeInt(this.state);
- dest.writeByte(this.isDownloadComplete ? (byte) 1 : (byte) 0);
- dest.writeLong(this.currentProgress);
- dest.writeInt(this.failNum);
- }
-
- protected DownloadEntity(Parcel in) {
- this.downloadUrl = in.readString();
- this.downloadPath = in.readString();
- this.completeTime = in.readLong();
- this.fileSize = in.readLong();
- this.state = in.readInt();
- this.isDownloadComplete = in.readByte() != 0;
- this.currentProgress = in.readLong();
- this.failNum = in.readInt();
- }
-
- public static final Creator CREATOR = new Creator() {
- @Override
- public DownloadEntity createFromParcel(Parcel source) {
- return new DownloadEntity(source);
- }
-
- @Override
- public DownloadEntity[] newArray(int size) {
- return new DownloadEntity[size];
- }
- };
-
- @Override
- public String toString() {
- return "DownloadEntity{" +
- "downloadUrl='" + downloadUrl + '\'' +
- ", downloadPath='" + downloadPath + '\'' +
- ", completeTime=" + completeTime +
- ", fileSize=" + fileSize +
- ", state=" + state +
- ", isDownloadComplete=" + isDownloadComplete +
- ", currentProgress=" + currentProgress +
- ", failNum=" + failNum +
- '}';
- }
+ /**
+ * 其它状态
+ */
+ public static final int STATE_OTHER = -1;
+ /**
+ * 失败状态
+ */
+ public static final int STATE_FAIL = 0;
+ /**
+ * 完成状态
+ */
+ public static final int STATE_COMPLETE = 1;
+ /**
+ * 停止状态
+ */
+ public static final int STATE_STOP = 2;
+ /**
+ * 未开始状态
+ */
+ public static final int STATE_WAIT = 3;
+ /**
+ * 下载中
+ */
+ public static final int STATE_DOWNLOAD_ING = 4;
+ /**
+ * 取消下载
+ */
+ public static final int STATE_CANCEL = 5;
+
+ private String downloadUrl; //下载路径
+ private String downloadPath; //保存路径
+ private String fileName; //文件名
+ private String str; //其它字段
+ private long completeTime; //完成时间
+ private long fileSize = 1;
+ private int state = STATE_WAIT;
+ private boolean isDownloadComplete = false; //是否下载完成
+ private long currentProgress = 0; //当前下载进度
+ private int failNum = 0;
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public int getFailNum() {
+ return failNum;
+ }
+
+ public void setFailNum(int failNum) {
+ this.failNum = failNum;
+ }
+
+ public String getDownloadUrl() {
+ return downloadUrl;
+ }
+
+ public long getCompleteTime() {
+ return completeTime;
+ }
+
+ public void setCompleteTime(long completeTime) {
+ this.completeTime = completeTime;
+ }
+
+ public void setDownloadUrl(String downloadUrl) {
+ this.downloadUrl = downloadUrl;
+ }
+
+ public String getDownloadPath() {
+ return downloadPath;
+ }
+
+ public void setDownloadPath(String downloadPath) {
+ this.downloadPath = downloadPath;
+ }
+
+ public long getFileSize() {
+ return fileSize;
+ }
+
+ public void setFileSize(long fileSize) {
+ this.fileSize = fileSize;
+ }
+
+ public int getState() {
+ return state;
+ }
+
+ public void setState(int state) {
+ this.state = state;
+ }
+
+ public boolean isDownloadComplete() {
+ return isDownloadComplete;
+ }
+
+ public void setDownloadComplete(boolean downloadComplete) {
+ isDownloadComplete = downloadComplete;
+ }
+
+ public long getCurrentProgress() {
+ return currentProgress;
+ }
+
+ public void setCurrentProgress(long currentProgress) {
+ this.currentProgress = currentProgress;
+ }
+
+ @Override public DownloadEntity clone() throws CloneNotSupportedException {
+ return (DownloadEntity) super.clone();
+ }
+
+ public DownloadEntity() {
+ }
+
+ @Override public int describeContents() {
+ return 0;
+ }
+
+ @Override public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.downloadUrl);
+ dest.writeString(this.downloadPath);
+ dest.writeLong(this.completeTime);
+ dest.writeLong(this.fileSize);
+ dest.writeInt(this.state);
+ dest.writeByte(this.isDownloadComplete ? (byte) 1 : (byte) 0);
+ dest.writeLong(this.currentProgress);
+ dest.writeInt(this.failNum);
+ }
+
+ protected DownloadEntity(Parcel in) {
+ this.downloadUrl = in.readString();
+ this.downloadPath = in.readString();
+ this.completeTime = in.readLong();
+ this.fileSize = in.readLong();
+ this.state = in.readInt();
+ this.isDownloadComplete = in.readByte() != 0;
+ this.currentProgress = in.readLong();
+ this.failNum = in.readInt();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override public DownloadEntity createFromParcel(Parcel source) {
+ return new DownloadEntity(source);
+ }
+
+ @Override public DownloadEntity[] newArray(int size) {
+ return new DownloadEntity[size];
+ }
+ };
+
+ @Override public String toString() {
+ return "DownloadEntity{" +
+ "downloadUrl='" + downloadUrl + '\'' +
+ ", downloadPath='" + downloadPath + '\'' +
+ ", completeTime=" + completeTime +
+ ", fileSize=" + fileSize +
+ ", state=" + state +
+ ", isDownloadComplete=" + isDownloadComplete +
+ ", currentProgress=" + currentProgress +
+ ", failNum=" + failNum +
+ '}';
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/help/CheckHelp.java b/downloadutil/src/main/java/com/arialyy/downloadutil/help/CheckHelp.java
index 03a1a3c5..4331b1d4 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/help/CheckHelp.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/help/CheckHelp.java
@@ -1,6 +1,5 @@
package com.arialyy.downloadutil.help;
-import android.app.Application;
import android.content.res.Resources;
import android.text.TextUtils;
import android.util.Log;
@@ -28,20 +27,20 @@ public class CheckHelp {
} else if (TextUtils.isEmpty(entity.getDownloadUrl())) {
Log.w(TAG, Resources.getSystem().getString(R.string.error_download_url_null));
return false;
- } else if (TextUtils.isEmpty(entity.getFileName())){
+ } else if (TextUtils.isEmpty(entity.getFileName())) {
Log.w(TAG, Resources.getSystem().getString(R.string.error_file_name_null));
return false;
- } else if (TextUtils.isEmpty(entity.getDownloadPath())){
+ } else if (TextUtils.isEmpty(entity.getDownloadPath())) {
Log.w(TAG, Resources.getSystem().getString(R.string.error_file_name_null));
return false;
}
String fileName = entity.getFileName();
- if (fileName.contains(" ")){
+ if (fileName.contains(" ")) {
fileName = fileName.replace(" ", "_");
}
String dPath = entity.getDownloadPath();
File file = new File(dPath);
- if (file.isDirectory()){
+ if (file.isDirectory()) {
dPath += fileName;
entity.setDownloadPath(dPath);
}
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 f5abfdf6..4a6d2a22 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbEntity.java
@@ -4,10 +4,7 @@ import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
-
-
import com.arialyy.downloadutil.util.Util;
-
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -20,176 +17,176 @@ import java.util.List;
* 所有数据库实体父类
*/
public class DbEntity {
- private static final String TAG = "DbEntity";
- private volatile static SQLiteDatabase mDb = null;
- private volatile static DbUtil mUtil;
- private Context mContext;
- private static final Object LOCK = new Object();
- protected int rowID = -1;
+ private static final String TAG = "DbEntity";
+ private volatile static SQLiteDatabase mDb = null;
+ private volatile static DbUtil mUtil;
+ private Context mContext;
+ private static final Object LOCK = new Object();
+ protected int rowID = -1;
- protected DbEntity() {
+ protected DbEntity() {
- }
+ }
- public DbEntity(Context context) {
- this(context, true);
- }
+ public DbEntity(Context context) {
+ this(context, true);
+ }
- public DbEntity(Context context, boolean newTable) {
- mContext = context;
- init(newTable);
- }
+ public DbEntity(Context context, boolean newTable) {
+ mContext = context;
+ init(newTable);
+ }
- private void init(boolean newTable) {
+ private void init(boolean newTable) {
+ if (mDb == null) {
+ synchronized (LOCK) {
if (mDb == null) {
- synchronized (LOCK) {
- if (mDb == null) {
- SqlHelper mHelper = new SqlHelper(mContext);
- mDb = mHelper.getWritableDatabase();
- mUtil = DbUtil.getInstance(mDb);
- }
- }
- }
- if (newTable && !mUtil.tableExists(this)) {
- mUtil.createTable(this);
+ SqlHelper mHelper = new SqlHelper(mContext);
+ mDb = mHelper.getWritableDatabase();
+ mUtil = DbUtil.getInstance(mDb);
}
+ }
}
-
- /**
- * 获取所有行的rowid
- */
- public int[] getRowId() {
- Cursor cursor = mUtil.getRowId(this);
- int[] ids = new int[cursor.getCount()];
- int i = 0;
- while (cursor.moveToNext()) {
- ids[i] = cursor.getInt(cursor.getColumnIndex("rowid"));
- i++;
- }
- return ids;
- }
-
- /**
- * 获取rowid
- */
- public int getRowId(@NonNull Object[] wheres, @NonNull Object[] values) {
- return mUtil.getRowId(this, wheres, values);
- }
-
- /**
- * 删除当前数据
- */
- public void deleteData() {
- mUtil.delData(this, new Object[]{"rowid"}, new Object[]{rowID});
+ if (newTable && !mUtil.tableExists(this)) {
+ mUtil.createTable(this);
}
-
- /**
- * 根据条件删除数据
- */
- public void deleteData(@NonNull Object[] wheres, @NonNull Object[] values) {
- mUtil.delData(this, wheres, values);
+ }
+
+ /**
+ * 获取所有行的rowid
+ */
+ public int[] getRowId() {
+ Cursor cursor = mUtil.getRowId(this);
+ int[] ids = new int[cursor.getCount()];
+ int i = 0;
+ while (cursor.moveToNext()) {
+ ids[i] = cursor.getInt(cursor.getColumnIndex("rowid"));
+ i++;
}
-
- /**
- * 修改数据
- */
- public void update() {
- mUtil.modifyData(this);
- }
-
- /**
- * 插入数据
- */
- public void save() {
- mUtil.insertData(this);
- }
-
- /**
- * 查询所有数据
- *
- * @return 没有数据返回null
- */
- public List findAllData(Class clazz) {
- Cursor cursor = mUtil.findAllData(this);
- return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
- }
-
- /**
- * 查询一组数据
- *
- * @return 没有数据返回null
- */
- public List findDatas(Class clazz, @NonNull Object[] wheres, @NonNull Object[] values) {
- Cursor cursor = mUtil.findData(this, wheres, values);
- return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
- }
-
- /**
- * 查询一行数据
- *
- * @return 没有数据返回null
- */
- public T findData(Class clazz, @NonNull Object[] wheres, @NonNull Object[] values) {
- Cursor cursor = mUtil.findData(this, wheres, values);
- return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor).get(0) : null;
- }
-
- /**
- * 根据数据游标创建一个具体的对象
- */
- private List newInstanceEntity(Class clazz, Cursor cursor) {
- Field[] fields = Util.getFields(clazz);
- List entitys = new ArrayList<>();
- if (fields != null && fields.length > 0) {
- try {
- while (cursor.moveToNext()) {
- Class[] paramTypes = {Context.class, boolean.class};
- Object[] params = {mContext, false};
- Constructor con = clazz.getConstructor(paramTypes);
- T entity = con.newInstance(params);
- for (Field field : fields) {
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- continue;
- }
- Class> type = field.getType();
- int column = cursor.getColumnIndex(field.getName());
- if (type == String.class) {
- field.set(entity, cursor.getString(column));
- } else if (type == int.class || type == Integer.class) {
- field.setInt(entity, cursor.getInt(column));
- } else if (type == float.class || type == Float.class) {
- field.setFloat(entity, cursor.getFloat(column));
- } else if (type == double.class || type == Double.class) {
- field.setDouble(entity, cursor.getDouble(column));
- } else if (type == long.class || type == Long.class) {
- field.setLong(entity, cursor.getLong(column));
- } else if (type == boolean.class || type == Boolean.class) {
- field.setBoolean(entity, !cursor.getString(column).equalsIgnoreCase("false"));
- } else if (type == java.util.Date.class || type == java.sql.Date.class) {
- field.set(entity, new Date(cursor.getString(column)));
- } else if (type == byte[].class) {
- field.set(entity, cursor.getBlob(column));
- }
-// field.set(entity, cursor.getColumnIndex("entity_id"));
- }
- entity.rowID = cursor.getInt(cursor.getColumnIndex("rowid"));
- entitys.add(entity);
- }
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
+ return ids;
+ }
+
+ /**
+ * 获取rowid
+ */
+ public int getRowId(@NonNull Object[] wheres, @NonNull Object[] values) {
+ return mUtil.getRowId(this, wheres, values);
+ }
+
+ /**
+ * 删除当前数据
+ */
+ public void deleteData() {
+ mUtil.delData(this, new Object[] { "rowid" }, new Object[] { rowID });
+ }
+
+ /**
+ * 根据条件删除数据
+ */
+ public void deleteData(@NonNull Object[] wheres, @NonNull Object[] values) {
+ mUtil.delData(this, wheres, values);
+ }
+
+ /**
+ * 修改数据
+ */
+ public void update() {
+ mUtil.modifyData(this);
+ }
+
+ /**
+ * 插入数据
+ */
+ public void save() {
+ mUtil.insertData(this);
+ }
+
+ /**
+ * 查询所有数据
+ *
+ * @return 没有数据返回null
+ */
+ public List findAllData(Class clazz) {
+ Cursor cursor = mUtil.findAllData(this);
+ return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
+ }
+
+ /**
+ * 查询一组数据
+ *
+ * @return 没有数据返回null
+ */
+ public List findDatas(Class clazz, @NonNull Object[] wheres,
+ @NonNull Object[] values) {
+ Cursor cursor = mUtil.findData(this, wheres, values);
+ return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
+ }
+
+ /**
+ * 查询一行数据
+ *
+ * @return 没有数据返回null
+ */
+ public T findData(Class clazz, @NonNull Object[] wheres,
+ @NonNull Object[] values) {
+ Cursor cursor = mUtil.findData(this, wheres, values);
+ return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor).get(0) : null;
+ }
+
+ /**
+ * 根据数据游标创建一个具体的对象
+ */
+ private List newInstanceEntity(Class clazz, Cursor cursor) {
+ Field[] fields = Util.getFields(clazz);
+ List entitys = new ArrayList<>();
+ if (fields != null && fields.length > 0) {
+ try {
+ while (cursor.moveToNext()) {
+ Class[] paramTypes = { Context.class, boolean.class };
+ Object[] params = { mContext, false };
+ Constructor con = clazz.getConstructor(paramTypes);
+ T entity = con.newInstance(params);
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
}
+ Class> type = field.getType();
+ int column = cursor.getColumnIndex(field.getName());
+ if (type == String.class) {
+ field.set(entity, cursor.getString(column));
+ } else if (type == int.class || type == Integer.class) {
+ field.setInt(entity, cursor.getInt(column));
+ } else if (type == float.class || type == Float.class) {
+ field.setFloat(entity, cursor.getFloat(column));
+ } else if (type == double.class || type == Double.class) {
+ field.setDouble(entity, cursor.getDouble(column));
+ } else if (type == long.class || type == Long.class) {
+ field.setLong(entity, cursor.getLong(column));
+ } else if (type == boolean.class || type == Boolean.class) {
+ field.setBoolean(entity, !cursor.getString(column).equalsIgnoreCase("false"));
+ } else if (type == java.util.Date.class || type == java.sql.Date.class) {
+ field.set(entity, new Date(cursor.getString(column)));
+ } else if (type == byte[].class) {
+ field.set(entity, cursor.getBlob(column));
+ }
+ // field.set(entity, cursor.getColumnIndex("entity_id"));
+ }
+ entity.rowID = cursor.getInt(cursor.getColumnIndex("rowid"));
+ entitys.add(entity);
}
- cursor.close();
- return entitys;
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
}
-
-
+ cursor.close();
+ return entitys;
+ }
}
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 ba865a04..37fef4cd 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/DbUtil.java
@@ -1,11 +1,10 @@
package com.arialyy.downloadutil.orm;
+
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import android.util.Log;
-
import com.arialyy.downloadutil.util.Util;
-
import java.lang.reflect.Field;
/**
@@ -13,318 +12,311 @@ import java.lang.reflect.Field;
* 数据库操作工具
*/
public class DbUtil {
- private static final String TAG = "DbUtil";
- private volatile static DbUtil mDbUtil = null;
- private int CREATE_TABLE = 0;
- private int TABLE_EXISTS = 1;
- private int INSERT_DATA = 2;
- private int MODIFY_DATA = 3;
- private int FIND_DATA = 4;
- private int FIND_ALL_DATA = 5;
- private int DEL_DATA = 6;
- private int ROW_ID = 7;
- private static final Object LOCK = new Object();
- private SQLiteDatabase mDb;
+ private static final String TAG = "DbUtil";
+ private volatile static DbUtil mDbUtil = null;
+ private int CREATE_TABLE = 0;
+ private int TABLE_EXISTS = 1;
+ private int INSERT_DATA = 2;
+ private int MODIFY_DATA = 3;
+ private int FIND_DATA = 4;
+ private int FIND_ALL_DATA = 5;
+ private int DEL_DATA = 6;
+ private int ROW_ID = 7;
+ private static final Object LOCK = new Object();
+ private SQLiteDatabase mDb;
- private DbUtil() {
+ private DbUtil() {
- }
+ }
- private DbUtil(SQLiteDatabase db) {
- mDb = db;
- }
+ private DbUtil(SQLiteDatabase db) {
+ mDb = db;
+ }
- protected static DbUtil getInstance(SQLiteDatabase db) {
+ protected static DbUtil getInstance(SQLiteDatabase db) {
+ if (mDbUtil == null) {
+ synchronized (LOCK) {
if (mDbUtil == null) {
- synchronized (LOCK) {
- if (mDbUtil == null) {
- mDbUtil = new DbUtil(db);
- }
- }
+ mDbUtil = new DbUtil(db);
}
- return mDbUtil;
+ }
}
+ return mDbUtil;
+ }
- /**
- * 删除某条数据
- */
- protected void delData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
- if (wheres.length <= 0 || values.length <= 0) {
- Log.e(TAG, "输入删除条件");
- return;
- } else if (wheres.length != values.length) {
- Log.e(TAG, "key 和 vaule 长度不相等");
- return;
- }
- StringBuilder sb = new StringBuilder();
- sb.append("DELETE FROM ").append(Util.getClassName(dbEntity)).append(" WHERE ");
- int i = 0;
- for (Object where : wheres) {
- sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ? "" : ",");
- i++;
- }
- print(DEL_DATA, sb.toString());
- mDb.execSQL(sb.toString());
-
- }
-
- /**
- * 修改某行数据
- */
- protected void modifyData(DbEntity dbEntity) {
- Class> clazz = dbEntity.getClass();
- Field[] fields = Util.getFields(clazz);
- if (fields != null && fields.length > 0) {
- StringBuilder sb = new StringBuilder();
- sb.append("UPDATE ").append(Util.getClassName(dbEntity)).append(" SET ");
- int i = 0;
- for (Field field : fields) {
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- continue;
- }
- sb.append(i > 0 ? ", " : "");
- try {
- sb.append(field.getName()).append(" = '").append(field.get(dbEntity).toString()).append("'");
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- i++;
- }
- print(MODIFY_DATA, sb.toString());
- mDb.execSQL(sb.toString());
- }
+ /**
+ * 删除某条数据
+ */
+ protected void delData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
+ if (wheres.length <= 0 || values.length <= 0) {
+ Log.e(TAG, "输入删除条件");
+ return;
+ } else if (wheres.length != values.length) {
+ Log.e(TAG, "key 和 vaule 长度不相等");
+ return;
}
-
- /**
- * 遍历所有数据
- */
- protected Cursor findAllData(DbEntity dbEntity) {
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
- print(FIND_ALL_DATA, sb.toString());
- return mDb.rawQuery(sb.toString(), null);
+ StringBuilder sb = new StringBuilder();
+ sb.append("DELETE FROM ").append(Util.getClassName(dbEntity)).append(" WHERE ");
+ int i = 0;
+ for (Object where : wheres) {
+ sb.append(where).append("=").append("'").append(values[i]).append("'");
+ sb.append(i >= wheres.length - 1 ? "" : ",");
+ i++;
}
+ print(DEL_DATA, sb.toString());
+ mDb.execSQL(sb.toString());
+ }
-
- /**
- * 条件查寻数据
- */
- protected Cursor findData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
- if (wheres.length <= 0 || values.length <= 0) {
- Log.e(TAG, "请输入查询条件");
- return null;
- } else if (wheres.length != values.length) {
- Log.e(TAG, "key 和 vaule 长度不相等");
- return null;
+ /**
+ * 修改某行数据
+ */
+ protected void modifyData(DbEntity dbEntity) {
+ Class> clazz = dbEntity.getClass();
+ Field[] fields = Util.getFields(clazz);
+ if (fields != null && fields.length > 0) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("UPDATE ").append(Util.getClassName(dbEntity)).append(" SET ");
+ int i = 0;
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
}
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity)).append(" where ");
- int i = 0;
- for (Object where : wheres) {
- sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ? "" : ", ");
- i++;
+ sb.append(i > 0 ? ", " : "");
+ try {
+ sb.append(field.getName())
+ .append(" = '")
+ .append(field.get(dbEntity).toString())
+ .append("'");
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
}
- print(FIND_DATA, sb.toString());
- return mDb.rawQuery(sb.toString(), null);
+ i++;
+ }
+ print(MODIFY_DATA, sb.toString());
+ mDb.execSQL(sb.toString());
}
+ }
- /**
- * 插入数据
- */
- protected void insertData(DbEntity dbEntity) {
- Class> clazz = dbEntity.getClass();
- Field[] fields = Util.getFields(clazz);
- if (fields != null && fields.length > 0) {
- StringBuilder sb = new StringBuilder();
- sb.append("INSERT INTO ").append(Util.getClassName(dbEntity)).append("(");
- int i = 0;
- for (Field field : fields) {
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- continue;
- }
- sb.append(i > 0 ? ", " : "");
- sb.append(field.getName());
- i++;
- }
- sb.append(") VALUES (");
- i = 0;
- for (Field field : fields) {
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- continue;
- }
- sb.append(i > 0 ? ", " : "");
- sb.append("'");
- try {
- sb.append(field.get(dbEntity)).append("'");
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- i++;
- }
- sb.append(")");
- print(INSERT_DATA, sb.toString());
- mDb.execSQL(sb.toString());
- }
+ /**
+ * 遍历所有数据
+ */
+ protected Cursor findAllData(DbEntity dbEntity) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
+ print(FIND_ALL_DATA, sb.toString());
+ return mDb.rawQuery(sb.toString(), null);
+ }
+
+ /**
+ * 条件查寻数据
+ */
+ protected Cursor findData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
+ if (wheres.length <= 0 || values.length <= 0) {
+ Log.e(TAG, "请输入查询条件");
+ return null;
+ } else if (wheres.length != values.length) {
+ Log.e(TAG, "key 和 vaule 长度不相等");
+ return null;
}
+ StringBuilder sb = new StringBuilder();
+ sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity)).append(" where ");
+ int i = 0;
+ for (Object where : wheres) {
+ sb.append(where).append("=").append("'").append(values[i]).append("'");
+ sb.append(i >= wheres.length - 1 ? "" : ", ");
+ i++;
+ }
+ print(FIND_DATA, sb.toString());
+ return mDb.rawQuery(sb.toString(), null);
+ }
- /**
- * 查找某张表是否存在
- */
- protected boolean tableExists(DbEntity dbEntity) {
- Cursor cursor = null;
+ /**
+ * 插入数据
+ */
+ protected void insertData(DbEntity dbEntity) {
+ Class> clazz = dbEntity.getClass();
+ Field[] fields = Util.getFields(clazz);
+ if (fields != null && fields.length > 0) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("INSERT INTO ").append(Util.getClassName(dbEntity)).append("(");
+ int i = 0;
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
+ }
+ sb.append(i > 0 ? ", " : "");
+ sb.append(field.getName());
+ i++;
+ }
+ sb.append(") VALUES (");
+ i = 0;
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ continue;
+ }
+ sb.append(i > 0 ? ", " : "");
+ sb.append("'");
try {
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT COUNT(*) AS c FROM sqlite_master WHERE type ='table' AND name ='");
- sb.append(Util.getClassName(dbEntity));
- sb.append("'");
- print(TABLE_EXISTS, sb.toString());
- cursor = mDb.rawQuery(sb.toString(), null);
- if (cursor != null && cursor.moveToNext()) {
- int count = cursor.getInt(0);
- if (count > 0) {
- return true;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (cursor != null)
- cursor.close();
+ sb.append(field.get(dbEntity)).append("'");
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
}
- return false;
+ i++;
+ }
+ sb.append(")");
+ print(INSERT_DATA, sb.toString());
+ mDb.execSQL(sb.toString());
}
+ }
- /**
- * 创建表
- *
- * @param dbEntity
- */
- protected void createTable(DbEntity dbEntity) {
- Field[] fields = Util.getFields(dbEntity.getClass());
- if (fields != null && fields.length > 0) {
- StringBuilder sb = new StringBuilder();
- sb.append("create table ")
- .append(Util.getClassName(dbEntity))
- .append("(");
- int i = 0;
- int ignoreNum = 0;
- for (Field field : fields) {
- i++;
- field.setAccessible(true);
- Ignore ignore = field.getAnnotation(Ignore.class);
- if (ignore != null && ignore.value()) {
- ignoreNum++;
- continue;
- }
- sb.append(field.getName());
- Class> type = field.getType();
- if (type == String.class) {
- sb.append(" varchar");
- } else if (type == int.class || type == Integer.class) {
- sb.append(" interger");
- } else if (type == float.class || type == Float.class) {
- sb.append(" float");
- } else if (type == double.class || type == Double.class) {
- sb.append(" double");
- } else if (type == long.class || type == Long.class) {
- sb.append(" bigint");
- } else if (type == boolean.class || type == Boolean.class) {
- sb.append(" boolean");
- } else if (type == java.util.Date.class || type == java.sql.Date.class) {
- sb.append(" data");
- } else {
- sb.append(" blob");
- }
- sb.append(i >= fields.length - ignoreNum - 1 ? "" : ", ");
- }
- sb.append(");");
- print(CREATE_TABLE, sb.toString());
- mDb.execSQL(sb.toString());
+ /**
+ * 查找某张表是否存在
+ */
+ protected boolean tableExists(DbEntity dbEntity) {
+ Cursor cursor = null;
+ try {
+ StringBuilder sb = new StringBuilder();
+ sb.append("SELECT COUNT(*) AS c FROM sqlite_master WHERE type ='table' AND name ='");
+ sb.append(Util.getClassName(dbEntity));
+ sb.append("'");
+ print(TABLE_EXISTS, sb.toString());
+ cursor = mDb.rawQuery(sb.toString(), null);
+ if (cursor != null && cursor.moveToNext()) {
+ int count = cursor.getInt(0);
+ if (count > 0) {
+ return true;
}
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (cursor != null) cursor.close();
}
+ return false;
+ }
- /**
- * 打印数据库日志
- *
- * @param type {@link DbUtil}
- * @param sql
- */
- private void print(int type, String sql) {
- String str = "";
- switch (type) {
- case 0:
- str = "创建表 >>>> ";
- break;
- case 1:
- str = "表是否存在 >>>> ";
- break;
- case 2:
- str = "插入数据 >>>> ";
- break;
- case 3:
- str = "修改数据 >>>> ";
- break;
- case 4:
- str = "查询一行数据 >>>> ";
- break;
- case 5:
- str = "遍历整个数据库 >>>> ";
- break;
+ /**
+ * 创建表
+ */
+ protected void createTable(DbEntity dbEntity) {
+ Field[] fields = Util.getFields(dbEntity.getClass());
+ if (fields != null && fields.length > 0) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("create table ").append(Util.getClassName(dbEntity)).append("(");
+ int i = 0;
+ int ignoreNum = 0;
+ for (Field field : fields) {
+ i++;
+ field.setAccessible(true);
+ Ignore ignore = field.getAnnotation(Ignore.class);
+ if (ignore != null && ignore.value()) {
+ ignoreNum++;
+ continue;
}
- Log.v(TAG, str + sql);
+ sb.append(field.getName());
+ Class> type = field.getType();
+ if (type == String.class) {
+ sb.append(" varchar");
+ } else if (type == int.class || type == Integer.class) {
+ sb.append(" interger");
+ } else if (type == float.class || type == Float.class) {
+ sb.append(" float");
+ } else if (type == double.class || type == Double.class) {
+ sb.append(" double");
+ } else if (type == long.class || type == Long.class) {
+ sb.append(" bigint");
+ } else if (type == boolean.class || type == Boolean.class) {
+ sb.append(" boolean");
+ } else if (type == java.util.Date.class || type == java.sql.Date.class) {
+ sb.append(" data");
+ } else {
+ sb.append(" blob");
+ }
+ sb.append(i >= fields.length - ignoreNum - 1 ? "" : ", ");
+ }
+ sb.append(");");
+ print(CREATE_TABLE, sb.toString());
+ mDb.execSQL(sb.toString());
}
+ }
- /**
- * 关闭数据库
- */
- protected void close() {
- if (mDb != null) {
- mDb.close();
- }
+ /**
+ * 打印数据库日志
+ *
+ * @param type {@link DbUtil}
+ */
+ private void print(int type, String sql) {
+ String str = "";
+ switch (type) {
+ case 0:
+ str = "创建表 >>>> ";
+ break;
+ case 1:
+ str = "表是否存在 >>>> ";
+ break;
+ case 2:
+ str = "插入数据 >>>> ";
+ break;
+ case 3:
+ str = "修改数据 >>>> ";
+ break;
+ case 4:
+ str = "查询一行数据 >>>> ";
+ break;
+ case 5:
+ str = "遍历整个数据库 >>>> ";
+ break;
}
+ Log.v(TAG, str + sql);
+ }
- /**
- * 获取所有行Id
- */
- protected Cursor getRowId(DbEntity dbEntity) {
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
- return mDb.rawQuery(sb.toString(), null);
+ /**
+ * 关闭数据库
+ */
+ protected void close() {
+ if (mDb != null) {
+ mDb.close();
}
+ }
- /**
- * 获取行Id
- *
- * @return
- */
- protected int getRowId(DbEntity dbEntity, Object[] wheres, Object[] values) {
- if (wheres.length <= 0 || values.length <= 0) {
- Log.e(TAG, "请输入删除条件");
- return -1;
- } else if (wheres.length != values.length) {
- Log.e(TAG, "key 和 vaule 长度不相等");
- return -1;
- }
- StringBuilder sb = new StringBuilder();
- sb.append("SELECT rowid FROM ").append(Util.getClassName(dbEntity)).append(" WHERE ");
- int i = 0;
- for (Object where : wheres) {
- sb.append(where).append("=").append("'").append(values[i]).append("'");
- sb.append(i >= wheres.length - 1 ? "" : ",");
- i++;
- }
- print(ROW_ID, sb.toString());
- Cursor c = mDb.rawQuery(sb.toString(), null);
- int id = c.getColumnIndex("rowid");
- c.close();
- return id;
+ /**
+ * 获取所有行Id
+ */
+ protected Cursor getRowId(DbEntity dbEntity) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("SELECT rowid, * FROM ").append(Util.getClassName(dbEntity));
+ return mDb.rawQuery(sb.toString(), null);
+ }
+
+ /**
+ * 获取行Id
+ */
+ protected int getRowId(DbEntity dbEntity, Object[] wheres, Object[] values) {
+ if (wheres.length <= 0 || values.length <= 0) {
+ Log.e(TAG, "请输入删除条件");
+ return -1;
+ } else if (wheres.length != values.length) {
+ Log.e(TAG, "key 和 vaule 长度不相等");
+ return -1;
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("SELECT rowid FROM ").append(Util.getClassName(dbEntity)).append(" WHERE ");
+ int i = 0;
+ for (Object where : wheres) {
+ sb.append(where).append("=").append("'").append(values[i]).append("'");
+ sb.append(i >= wheres.length - 1 ? "" : ",");
+ i++;
}
+ print(ROW_ID, sb.toString());
+ Cursor c = mDb.rawQuery(sb.toString(), null);
+ int id = c.getColumnIndex("rowid");
+ c.close();
+ return id;
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Id.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Id.java
index 0c6e56ae..049642a9 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Id.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Id.java
@@ -9,8 +9,6 @@ import java.lang.annotation.Target;
* Created by lyy on 2015/11/2.
* 表ID字段指定
*/
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Id {
- int value() default -1;
+@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Id {
+ int value() default -1;
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
index c1bedc14..1ae12c1e 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/Ignore.java
@@ -9,8 +9,6 @@ import java.lang.annotation.Target;
* Created by lyy on 2015/11/2.
* 忽略某个字段
*/
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Ignore {
- boolean value() default false;
+@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Ignore {
+ boolean value() default false;
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/SqlHelper.java b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/SqlHelper.java
index 13ddace8..73b4b9bd 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/orm/SqlHelper.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/orm/SqlHelper.java
@@ -10,29 +10,27 @@ import android.text.TextUtils;
* sql帮助类
*/
public class SqlHelper extends SQLiteOpenHelper {
- protected static String DB_NAME;
- protected static int VERSION = -1;
-
- static {
- if (TextUtils.isEmpty(DB_NAME)) {
- DB_NAME = "AriaLyyDb";
- }
- if (VERSION == -1) {
- VERSION = 1;
- }
- }
+ protected static String DB_NAME;
+ protected static int VERSION = -1;
- public SqlHelper(Context context) {
- super(context, DB_NAME, null, VERSION);
+ static {
+ if (TextUtils.isEmpty(DB_NAME)) {
+ DB_NAME = "AriaLyyDb";
+ }
+ if (VERSION == -1) {
+ VERSION = 1;
}
+ }
- @Override
- public void onCreate(SQLiteDatabase db) {
+ public SqlHelper(Context context) {
+ super(context, DB_NAME, null, VERSION);
+ }
- }
+ @Override public void onCreate(SQLiteDatabase db) {
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ }
- }
+ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+
+ }
}
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/util/DownLoadUtil.java b/downloadutil/src/main/java/com/arialyy/downloadutil/util/DownLoadUtil.java
index 9f3628bf..b5720817 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/DownLoadUtil.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/DownLoadUtil.java
@@ -4,7 +4,6 @@ import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import android.util.SparseArray;
-
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -13,431 +12,456 @@ import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
+
/**
* Created by lyy on 2015/8/25.
* 下载工具类
*/
public class DownLoadUtil {
- private static final String TAG = "DownLoadUtil";
- //下载监听
- private IDownloadListener mListener;
- /**
- * 线程数
- */
- private static final int THREAD_NUM = 3;
- /**
- * 已经完成下载任务的线程数量
- */
- private int mCompleteThreadNum = 0;
- 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;
- private int mCancelNum = 0;
- private int mStopNum = 0;
- public DownLoadUtil() {
- }
- public IDownloadListener getListener(){
- return mListener;
- }
- /**
- * 获取当前下载位置
- *
- * @return
- */
- public long getCurrentLocation() {
- return mCurrentLocation;
- }
- public boolean isDownloading() {
- return isDownloading;
- }
- /**
- * 取消下载
- */
- public void cancelDownload() {
- isCancel = true;
- }
- /**
- * 停止下载
- */
- public void stopDownload() {
- isStop = true;
+ private static final String TAG = "DownLoadUtil";
+ //下载监听
+ private IDownloadListener mListener;
+ /**
+ * 线程数
+ */
+ private static final int THREAD_NUM = 3;
+ /**
+ * 已经完成下载任务的线程数量
+ */
+ private int mCompleteThreadNum = 0;
+ 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;
+ private int mCancelNum = 0;
+ private int mStopNum = 0;
+
+ public DownLoadUtil() {
+ }
+
+ public IDownloadListener getListener() {
+ return mListener;
+ }
+
+ /**
+ * 获取当前下载位置
+ */
+ public long getCurrentLocation() {
+ return mCurrentLocation;
+ }
+
+ public boolean isDownloading() {
+ return isDownloading;
+ }
+
+ /**
+ * 取消下载
+ */
+ public void cancelDownload() {
+ isCancel = true;
+ }
+
+ /**
+ * 停止下载
+ */
+ public void stopDownload() {
+ isStop = true;
+ }
+
+ /**
+ * 多线程断点续传下载文件,暂停和继续
+ *
+ * @param context 必须添加该参数,不能使用全局变量的context
+ * @param downloadUrl 下载路径
+ * @param filePath 保存路径
+ * @param downloadListener 下载进度监听 {@link DownloadListener}
+ */
+ public void download(final Context context, @NonNull final String downloadUrl,
+ @NonNull final String filePath, @NonNull final IDownloadListener downloadListener) {
+ isDownloading = true;
+ mCurrentLocation = 0;
+ isStop = false;
+ isCancel = false;
+ mCancelNum = 0;
+ mStopNum = 0;
+ final File dFile = new File(filePath);
+ //读取已完成的线程数
+ final File configFile =
+ new File(context.getFilesDir().getPath() + "/temp/" + dFile.getName() + ".properties");
+ try {
+ if (!configFile.exists()) { //记录文件被删除,则重新下载
+ isNewTask = true;
+ Util.createFile(configFile.getPath());
+ } else {
+ isNewTask = !dFile.exists();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ failDownload("下载失败,记录文件被删除");
+ return;
}
- /**
- * 多线程断点续传下载文件,暂停和继续
- *
- * @param context 必须添加该参数,不能使用全局变量的context
- * @param downloadUrl 下载路径
- * @param filePath 保存路径
- * @param downloadListener 下载进度监听 {@link DownloadListener}
- */
- public void download(final Context context, @NonNull final String downloadUrl, @NonNull final String filePath,
- @NonNull final IDownloadListener downloadListener) {
- isDownloading = true;
- mCurrentLocation = 0;
- isStop = false;
- isCancel = false;
- mCancelNum = 0;
- mStopNum = 0;
- final File dFile = new File(filePath);
- //读取已完成的线程数
- final File configFile = new File(context.getFilesDir().getPath() + "/temp/" + dFile.getName() + ".properties");
+ new Thread(new Runnable() {
+ @Override public void run() {
try {
- if (!configFile.exists()) { //记录文件被删除,则重新下载
- isNewTask = true;
- Util.createFile(configFile.getPath());
- } else {
- isNewTask = !dFile.exists();
- }
- } catch (Exception e) {
- e.printStackTrace();
- failDownload("下载失败,记录文件被删除");
+ mListener = downloadListener;
+ URL url = new URL(downloadUrl);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod("GET");
+ conn.setRequestProperty("Charset", "UTF-8");
+ conn.setConnectTimeout(TIME_OUT * 4);
+ 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)");
+ 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, */*");
+ conn.connect();
+ int len = conn.getContentLength();
+ if (len < 0) { //网络被劫持时会出现这个问题
+ failDownload("下载失败,网络被劫持");
return;
- }
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- mListener = downloadListener;
- URL url = new URL(downloadUrl);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- conn.setRequestProperty("Charset", "UTF-8");
- conn.setConnectTimeout(TIME_OUT * 4);
- 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)");
- 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, */*");
- conn.connect();
- int len = conn.getContentLength();
- if (len < 0) { //网络被劫持时会出现这个问题
- failDownload("下载失败,网络被劫持");
- return;
- }
- int code = conn.getResponseCode();
- if (code == 200) {
- int fileLength = conn.getContentLength();
- //必须建一个文件
- Util.createFile(filePath);
- RandomAccessFile file = new RandomAccessFile(filePath, "rwd");
- //设置文件长度
- file.setLength(fileLength);
- mListener.onPreDownload(conn);
- //分配每条线程的下载区间
- Properties pro = null;
- pro = Util.loadConfig(configFile);
- if (pro.isEmpty()) {
- isNewTask = true;
- } else {
- for (int i = 0; i < THREAD_NUM; i++) {
- if (pro.getProperty(dFile.getName() + "_record_" + i) == null) {
- Object state = pro.getProperty(dFile.getName() + "_state_" + i);
- if (state != null && Integer.parseInt(state + "") == 1) {
- continue;
- }
- isNewTask = true;
- break;
- }
- }
- }
- int blockSize = fileLength / THREAD_NUM;
- SparseArray tasks = new SparseArray<>();
- int[] recordL = new int[THREAD_NUM];
- int rl = 0;
- for (int i = 0; i < THREAD_NUM; i++) {
- recordL[i] = -1;
- }
- for (int i = 0; i < THREAD_NUM; i++) {
- long startL = i * blockSize, endL = (i + 1) * blockSize;
- Object state = pro.getProperty(dFile.getName() + "_state_" + i);
- if (state != null && Integer.parseInt(state + "") == 1) { //该线程已经完成
- mCurrentLocation += endL - startL;
- Log.d(TAG, "++++++++++ 线程_" + i + "_已经下载完成 ++++++++++");
- mCompleteThreadNum++;
- mStopNum++;
- mCancelNum++;
- if (mCompleteThreadNum == THREAD_NUM) {
- if (configFile.exists()) {
- configFile.delete();
- }
- mListener.onComplete();
- isDownloading = false;
- return;
- }
- continue;
- }
- //分配下载位置
- Object record = pro.getProperty(dFile.getName() + "_record_" + i);
- if (!isNewTask && record != null && Long.parseLong(record + "") > 0) { //如果有记录,则恢复下载
- Long r = Long.parseLong(record + "");
- mCurrentLocation += r - startL;
- Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
- mListener.onChildResume(r);
- startL = r;
- recordL[rl] = i;
- rl++;
- }else {
- isNewTask = true;
- }
- if (isNewTask) {
- recordL[rl] = i;
- rl++;
- }
- if (i == (THREAD_NUM - 1)) {
- endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度
- }
- DownloadEntity entity = new DownloadEntity(context, fileLength, downloadUrl, dFile, i, startL, endL);
- DownLoadTask task = new DownLoadTask(entity);
- tasks.put(i, new Thread(task));
- }
- if (mCurrentLocation > 0) {
- mListener.onResume(mCurrentLocation);
- } else {
- mListener.onStart(mCurrentLocation);
- }
- for (int l : recordL) {
- if (l == -1) continue;
- Thread task = tasks.get(l);
- if (task != null) {
- task.start();
- }
- }
- } else {
- failDownload("下载失败,返回码:" + code);
- }
- } catch (IOException e) {
- failDownload("下载失败【downloadUrl:" + downloadUrl + "】\n【filePath:" + filePath + "】" + Util.getPrintException(e));
+ }
+ int code = conn.getResponseCode();
+ if (code == 200) {
+ int fileLength = conn.getContentLength();
+ //必须建一个文件
+ Util.createFile(filePath);
+ RandomAccessFile file = new RandomAccessFile(filePath, "rwd");
+ //设置文件长度
+ file.setLength(fileLength);
+ mListener.onPreDownload(conn);
+ //分配每条线程的下载区间
+ Properties pro = null;
+ pro = Util.loadConfig(configFile);
+ if (pro.isEmpty()) {
+ isNewTask = true;
+ } else {
+ for (int i = 0; i < THREAD_NUM; i++) {
+ if (pro.getProperty(dFile.getName() + "_record_" + i) == null) {
+ Object state = pro.getProperty(dFile.getName() + "_state_" + i);
+ if (state != null && Integer.parseInt(state + "") == 1) {
+ continue;
+ }
+ isNewTask = true;
+ break;
}
+ }
}
- }).start();
- }
- private void failDownload(String msg){
- Log.e(TAG, msg);
- isDownloading = false;
- stopDownload();
- mListener.onFail();
- System.gc();
- }
- /**
- * 多线程下载任务类,不能使用AsyncTask来进行多线程下载,因为AsyncTask是串行执行的,这种方式下载速度太慢了
- */
- private class DownLoadTask implements Runnable {
- private static final String TAG = "DownLoadTask";
- private DownloadEntity dEntity;
- private String configFPath;
- public DownLoadTask(DownloadEntity downloadInfo) {
- this.dEntity = downloadInfo;
- configFPath = dEntity.context.getFilesDir().getPath() + "/temp/" + dEntity.tempFile.getName() + ".properties";
- }
- @Override
- public void run() {
- long currentLocation = 0;
- try {
- Log.d(TAG, "线程_" + dEntity.threadId + "_正在下载【" + "开始位置 : " + dEntity.startLocation + ",结束位置:" + dEntity.endLocation + "】");
- URL url = new URL(dEntity.downloadUrl);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- //在头里面请求下载开始位置和结束位置
- conn.setRequestProperty("Range", "bytes=" + dEntity.startLocation + "-" + dEntity.endLocation);
- conn.setRequestMethod("GET");
- conn.setRequestProperty("Charset", "UTF-8");
- conn.setConnectTimeout(TIME_OUT * 4);
- 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)");
- 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, */*");
- conn.setReadTimeout(TIME_OUT * 24); //设置读取流的等待时间,必须设置该参数
- InputStream is = conn.getInputStream();
- //创建可设置位置的文件
- RandomAccessFile file = new RandomAccessFile(dEntity.tempFile, "rwd");
- //设置每条线程写入文件的位置
- file.seek(dEntity.startLocation);
- byte[] buffer = new byte[1024];
- int len;
- //当前子线程的下载位置
- currentLocation = dEntity.startLocation;
- while ((len = is.read(buffer)) != -1) {
- if (isCancel) {
- Log.d(TAG, "++++++++++ thread_" + dEntity.threadId + "_cancel ++++++++++");
- break;
- }
- if (isStop) {
- break;
- }
- //把下载数据数据写入文件
- file.write(buffer, 0, len);
- synchronized (DownLoadUtil.this) {
- mCurrentLocation += len;
- mListener.onProgress(mCurrentLocation);
- }
- currentLocation += len;
- }
- file.close();
- is.close();
- if (isCancel) {
- synchronized (DownLoadUtil.this) {
- mCancelNum++;
- if (mCancelNum == THREAD_NUM) {
- File configFile = new File(configFPath);
- if (configFile.exists()) {
- configFile.delete();
- }
- if (dEntity.tempFile.exists()) {
- dEntity.tempFile.delete();
- }
- Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
- isDownloading = false;
- mListener.onCancel();
- System.gc();
- }
- }
- return;
- }
- //停止状态不需要删除记录文件
- if (isStop) {
- synchronized (DownLoadUtil.this) {
- mStopNum++;
- String location = String.valueOf(currentLocation);
- Log.i(TAG, "thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation);
- writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
- if (mStopNum == THREAD_NUM) {
- Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
- isDownloading = false;
- mListener.onStop(mCurrentLocation);
- System.gc();
- }
- }
- return;
- }
- Log.i(TAG, "线程【" + dEntity.threadId + "】下载完毕");
- writeConfig(dEntity.tempFile.getName() + "_state_" + dEntity.threadId, 1 + "");
- mListener.onChildComplete(dEntity.endLocation);
+ int blockSize = fileLength / THREAD_NUM;
+ SparseArray tasks = new SparseArray<>();
+ int[] recordL = new int[THREAD_NUM];
+ int rl = 0;
+ for (int i = 0; i < THREAD_NUM; i++) {
+ recordL[i] = -1;
+ }
+ for (int i = 0; i < THREAD_NUM; i++) {
+ long startL = i * blockSize, endL = (i + 1) * blockSize;
+ Object state = pro.getProperty(dFile.getName() + "_state_" + i);
+ if (state != null && Integer.parseInt(state + "") == 1) { //该线程已经完成
+ mCurrentLocation += endL - startL;
+ Log.d(TAG, "++++++++++ 线程_" + i + "_已经下载完成 ++++++++++");
mCompleteThreadNum++;
+ mStopNum++;
+ mCancelNum++;
if (mCompleteThreadNum == THREAD_NUM) {
- File configFile = new File(configFPath);
- if (configFile.exists()) {
- configFile.delete();
- }
- isDownloading = false;
- mListener.onComplete();
- System.gc();
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- isDownloading = false;
- synchronized (DownLoadUtil.this) {
- try {
- String location = String.valueOf(currentLocation);
- writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
- failDownload("下载链接异常");
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- } catch (IOException e) {
- synchronized (DownLoadUtil.this) {
- try {
- String location = String.valueOf(currentLocation);
- writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
- failDownload("下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e));
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- } catch (Exception e) {
- synchronized (DownLoadUtil.this) {
- try {
- String location = String.valueOf(currentLocation);
- writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
- failDownload("获取流失败" + Util.getPrintException(e));
- } catch (IOException e1) {
- e1.printStackTrace();
- }
+ if (configFile.exists()) {
+ configFile.delete();
+ }
+ mListener.onComplete();
+ isDownloading = false;
+ return;
}
+ continue;
+ }
+ //分配下载位置
+ Object record = pro.getProperty(dFile.getName() + "_record_" + i);
+ if (!isNewTask
+ && record != null
+ && Long.parseLong(record + "") > 0) { //如果有记录,则恢复下载
+ Long r = Long.parseLong(record + "");
+ mCurrentLocation += r - startL;
+ Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
+ mListener.onChildResume(r);
+ startL = r;
+ recordL[rl] = i;
+ rl++;
+ } else {
+ isNewTask = true;
+ }
+ if (isNewTask) {
+ recordL[rl] = i;
+ rl++;
+ }
+ if (i == (THREAD_NUM - 1)) {
+ endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度
+ }
+ DownloadEntity entity =
+ new DownloadEntity(context, fileLength, downloadUrl, dFile, i, startL, endL);
+ DownLoadTask task = new DownLoadTask(entity);
+ tasks.put(i, new Thread(task));
+ }
+ if (mCurrentLocation > 0) {
+ mListener.onResume(mCurrentLocation);
+ } else {
+ mListener.onStart(mCurrentLocation);
+ }
+ for (int l : recordL) {
+ if (l == -1) continue;
+ Thread task = tasks.get(l);
+ if (task != null) {
+ task.start();
+ }
+ }
+ } else {
+ failDownload("下载失败,返回码:" + code);
+ }
+ } catch (IOException e) {
+ failDownload("下载失败【downloadUrl:"
+ + downloadUrl
+ + "】\n【filePath:"
+ + filePath
+ + "】"
+ + Util.getPrintException(e));
+ }
+ }
+ }).start();
+ }
+
+ private void failDownload(String msg) {
+ Log.e(TAG, msg);
+ isDownloading = false;
+ stopDownload();
+ mListener.onFail();
+ System.gc();
+ }
+
+ /**
+ * 多线程下载任务类,不能使用AsyncTask来进行多线程下载,因为AsyncTask是串行执行的,这种方式下载速度太慢了
+ */
+ private class DownLoadTask implements Runnable {
+ private static final String TAG = "DownLoadTask";
+ private DownloadEntity dEntity;
+ private String configFPath;
+
+ public DownLoadTask(DownloadEntity downloadInfo) {
+ this.dEntity = downloadInfo;
+ configFPath = dEntity.context.getFilesDir().getPath()
+ + "/temp/"
+ + dEntity.tempFile.getName()
+ + ".properties";
+ }
+
+ @Override public void run() {
+ long currentLocation = 0;
+ try {
+ Log.d(TAG, "线程_"
+ + dEntity.threadId
+ + "_正在下载【"
+ + "开始位置 : "
+ + dEntity.startLocation
+ + ",结束位置:"
+ + dEntity.endLocation
+ + "】");
+ URL url = new URL(dEntity.downloadUrl);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ //在头里面请求下载开始位置和结束位置
+ conn.setRequestProperty("Range",
+ "bytes=" + dEntity.startLocation + "-" + dEntity.endLocation);
+ conn.setRequestMethod("GET");
+ conn.setRequestProperty("Charset", "UTF-8");
+ conn.setConnectTimeout(TIME_OUT * 4);
+ 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)");
+ 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, */*");
+ conn.setReadTimeout(TIME_OUT * 24); //设置读取流的等待时间,必须设置该参数
+ InputStream is = conn.getInputStream();
+ //创建可设置位置的文件
+ RandomAccessFile file = new RandomAccessFile(dEntity.tempFile, "rwd");
+ //设置每条线程写入文件的位置
+ file.seek(dEntity.startLocation);
+ byte[] buffer = new byte[1024];
+ int len;
+ //当前子线程的下载位置
+ currentLocation = dEntity.startLocation;
+ while ((len = is.read(buffer)) != -1) {
+ if (isCancel) {
+ Log.d(TAG, "++++++++++ thread_" + dEntity.threadId + "_cancel ++++++++++");
+ break;
+ }
+ if (isStop) {
+ break;
+ }
+ //把下载数据数据写入文件
+ file.write(buffer, 0, len);
+ synchronized (DownLoadUtil.this) {
+ mCurrentLocation += len;
+ mListener.onProgress(mCurrentLocation);
+ }
+ currentLocation += len;
+ }
+ file.close();
+ is.close();
+ if (isCancel) {
+ synchronized (DownLoadUtil.this) {
+ mCancelNum++;
+ if (mCancelNum == THREAD_NUM) {
+ File configFile = new File(configFPath);
+ if (configFile.exists()) {
+ configFile.delete();
+ }
+ if (dEntity.tempFile.exists()) {
+ dEntity.tempFile.delete();
+ }
+ Log.d(TAG, "++++++++++++++++ onCancel +++++++++++++++++");
+ isDownloading = false;
+ mListener.onCancel();
+ System.gc();
+ }
+ }
+ return;
+ }
+ //停止状态不需要删除记录文件
+ if (isStop) {
+ synchronized (DownLoadUtil.this) {
+ mStopNum++;
+ String location = String.valueOf(currentLocation);
+ Log.i(TAG,
+ "thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation);
+ writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
+ if (mStopNum == THREAD_NUM) {
+ Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
+ isDownloading = false;
+ mListener.onStop(mCurrentLocation);
+ System.gc();
}
+ }
+ return;
+ }
+ Log.i(TAG, "线程【" + dEntity.threadId + "】下载完毕");
+ writeConfig(dEntity.tempFile.getName() + "_state_" + dEntity.threadId, 1 + "");
+ mListener.onChildComplete(dEntity.endLocation);
+ mCompleteThreadNum++;
+ if (mCompleteThreadNum == THREAD_NUM) {
+ File configFile = new File(configFPath);
+ if (configFile.exists()) {
+ configFile.delete();
+ }
+ isDownloading = false;
+ mListener.onComplete();
+ System.gc();
}
- /**
- * 将记录写入到配置文件
- *
- * @param record
- */
- private void writeConfig(String key, String record) throws IOException {
- File configFile = new File(configFPath);
- Properties pro = Util.loadConfig(configFile);
- pro.setProperty(key, record);
- Util.saveConfig(configFile, pro);
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ isDownloading = false;
+ synchronized (DownLoadUtil.this) {
+ try {
+ String location = String.valueOf(currentLocation);
+ writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
+ failDownload("下载链接异常");
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
}
+ } catch (IOException e) {
+ synchronized (DownLoadUtil.this) {
+ try {
+ String location = String.valueOf(currentLocation);
+ writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
+ failDownload("下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e));
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+ } catch (Exception e) {
+ synchronized (DownLoadUtil.this) {
+ try {
+ String location = String.valueOf(currentLocation);
+ writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
+ failDownload("获取流失败" + Util.getPrintException(e));
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
}
+
/**
- * 子线程下载信息类
+ * 将记录写入到配置文件
*/
- private class DownloadEntity {
- //文件大小
- long fileSize;
- String downloadUrl;
- int threadId;
- long startLocation;
- long endLocation;
- File tempFile;
- Context context;
- public DownloadEntity(Context context, long fileSize, String downloadUrl, File file, int threadId, long startLocation, long endLocation) {
- this.fileSize = fileSize;
- this.downloadUrl = downloadUrl;
- this.tempFile = file;
- this.threadId = threadId;
- this.startLocation = startLocation;
- this.endLocation = endLocation;
- this.context = context;
- }
+ private void writeConfig(String key, String record) throws IOException {
+ File configFile = new File(configFPath);
+ Properties pro = Util.loadConfig(configFile);
+ pro.setProperty(key, record);
+ Util.saveConfig(configFile, pro);
}
+ }
- public static class DownloadListener implements IDownloadListener {
+ /**
+ * 子线程下载信息类
+ */
+ private class DownloadEntity {
+ //文件大小
+ long fileSize;
+ String downloadUrl;
+ int threadId;
+ long startLocation;
+ long endLocation;
+ File tempFile;
+ Context context;
- @Override
- public void onResume(long resumeLocation) {
+ public DownloadEntity(Context context, long fileSize, String downloadUrl, File file,
+ int threadId, long startLocation, long endLocation) {
+ this.fileSize = fileSize;
+ this.downloadUrl = downloadUrl;
+ this.tempFile = file;
+ this.threadId = threadId;
+ this.startLocation = startLocation;
+ this.endLocation = endLocation;
+ this.context = context;
+ }
+ }
- }
+ public static class DownloadListener implements IDownloadListener {
- @Override
- public void onCancel() {
+ @Override public void onResume(long resumeLocation) {
- }
+ }
- @Override
- public void onFail() {
+ @Override public void onCancel() {
- }
+ }
- @Override
- public void onPreDownload(HttpURLConnection connection) {
+ @Override public void onFail() {
- }
+ }
- @Override
- public void onProgress(long currentLocation) {
+ @Override public void onPreDownload(HttpURLConnection connection) {
- }
+ }
- @Override
- public void onChildComplete(long finishLocation) {
+ @Override public void onProgress(long currentLocation) {
- }
+ }
- @Override
- public void onStart(long startLocation) {
+ @Override public void onChildComplete(long finishLocation) {
- }
+ }
- @Override
- public void onChildResume(long resumeLocation) {
+ @Override public void onStart(long startLocation) {
- }
+ }
- @Override
- public void onStop(long stopLocation) {
+ @Override public void onChildResume(long resumeLocation) {
- }
+ }
- @Override
- public void onComplete() {
+ @Override public void onStop(long stopLocation) {
+
+ }
+
+ @Override public void onComplete() {
- }
}
+ }
}
\ No newline at end of file
diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/util/IDownloadListener.java b/downloadutil/src/main/java/com/arialyy/downloadutil/util/IDownloadListener.java
index cf9fab05..32588d27 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/IDownloadListener.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/IDownloadListener.java
@@ -6,54 +6,53 @@ import java.net.HttpURLConnection;
* 下载监听
*/
public interface IDownloadListener {
- /**
- * 取消下载
- */
- public void onCancel();
-
- /**
- * 下载失败
- */
- public void onFail();
-
- /**
- * 下载预处理,可通过HttpURLConnection获取文件长度
- */
- public void onPreDownload(HttpURLConnection connection);
-
- /**
- * 下载监听
- */
- public void onProgress(long currentLocation);
-
- /**
- * 单一线程的结束位置
- */
- public void onChildComplete(long finishLocation);
-
- /**
- * 开始
- */
- public void onStart(long startLocation);
-
- /**
- * 子程恢复下载的位置
- */
- public void onChildResume(long resumeLocation);
-
- /**
- * 恢复位置
- */
- public void onResume(long resumeLocation);
-
- /**
- * 停止
- */
- public void onStop(long stopLocation);
-
- /**
- * 下载完成
- */
- public void onComplete();
-
+ /**
+ * 取消下载
+ */
+ public void onCancel();
+
+ /**
+ * 下载失败
+ */
+ public void onFail();
+
+ /**
+ * 下载预处理,可通过HttpURLConnection获取文件长度
+ */
+ public void onPreDownload(HttpURLConnection connection);
+
+ /**
+ * 下载监听
+ */
+ public void onProgress(long currentLocation);
+
+ /**
+ * 单一线程的结束位置
+ */
+ public void onChildComplete(long finishLocation);
+
+ /**
+ * 开始
+ */
+ public void onStart(long startLocation);
+
+ /**
+ * 子程恢复下载的位置
+ */
+ public void onChildResume(long resumeLocation);
+
+ /**
+ * 恢复位置
+ */
+ public void onResume(long resumeLocation);
+
+ /**
+ * 停止
+ */
+ public void onStop(long stopLocation);
+
+ /**
+ * 下载完成
+ */
+ public void onComplete();
}
\ No newline at end of file
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 ee06cc8d..eddd0af1 100644
--- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java
+++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/Util.java
@@ -1,13 +1,10 @@
package com.arialyy.downloadutil.util;
import android.util.Log;
-
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.security.MessageDigest;
@@ -18,228 +15,212 @@ import java.util.Properties;
* Created by lyy on 2016/1/22.
*/
public class Util {
- private static final String TAG = "util";
-
- /**
- * 将缓存的key转换为hash码
- *
- * @param key 缓存的key
- * @return 转换后的key的值, 系统便是通过该key来读写缓存
- */
- public static String keyToHashKey(String key) {
- String cacheKey;
- try {
- final MessageDigest mDigest = MessageDigest.getInstance("MD5");
- mDigest.update(key.getBytes());
- cacheKey = bytesToHexString(mDigest.digest());
- } catch (NoSuchAlgorithmException e) {
- cacheKey = String.valueOf(key.hashCode());
- }
- return cacheKey;
+ private static final String TAG = "util";
+
+ /**
+ * 将缓存的key转换为hash码
+ *
+ * @param key 缓存的key
+ * @return 转换后的key的值, 系统便是通过该key来读写缓存
+ */
+ public static String keyToHashKey(String key) {
+ String cacheKey;
+ try {
+ final MessageDigest mDigest = MessageDigest.getInstance("MD5");
+ mDigest.update(key.getBytes());
+ cacheKey = bytesToHexString(mDigest.digest());
+ } catch (NoSuchAlgorithmException e) {
+ cacheKey = String.valueOf(key.hashCode());
}
-
- /**
- * 将普通字符串转换为16位进制字符串
- *
- * @param src
- * @return
- */
- public static String bytesToHexString(byte[] src) {
- StringBuilder stringBuilder = new StringBuilder("0x");
- if (src == null || src.length <= 0) {
- return null;
- }
- char[] buffer = new char[2];
- for (byte aSrc : src) {
- buffer[0] = Character.forDigit((aSrc >>> 4) & 0x0F, 16);
- buffer[1] = Character.forDigit(aSrc & 0x0F, 16);
- stringBuilder.append(buffer);
- }
- return stringBuilder.toString();
+ return cacheKey;
+ }
+
+ /**
+ * 将普通字符串转换为16位进制字符串
+ */
+ public static String bytesToHexString(byte[] src) {
+ StringBuilder stringBuilder = new StringBuilder("0x");
+ if (src == null || src.length <= 0) {
+ return null;
}
-
- /**
- * 获取类里面的所在字段
- */
- 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;
+ char[] buffer = new char[2];
+ for (byte aSrc : src) {
+ buffer[0] = Character.forDigit((aSrc >>> 4) & 0x0F, 16);
+ buffer[1] = Character.forDigit(aSrc & 0x0F, 16);
+ stringBuilder.append(buffer);
}
-
- /**
- * 获取对象名
- *
- * @param obj 对象
- * @return 对象名
- */
- public static String getClassName(Object obj) {
- String arrays[] = obj.getClass().getName().split("\\.");
- return arrays[arrays.length - 1];
+ 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;
+ }
+
+ /**
+ * 获取对象名
+ *
+ * @param obj 对象
+ * @return 对象名
+ */
+ public static String getClassName(Object obj) {
+ String arrays[] = obj.getClass().getName().split("\\.");
+ return arrays[arrays.length - 1];
+ }
+
+ /**
+ * 格式化文件大小
+ *
+ * @param size file.length() 获取文件大小
+ */
+ public static String formatFileSize(double size) {
+ double kiloByte = size / 1024;
+ if (kiloByte < 1) {
+ return size + "Byte(s)";
}
- /**
- * 格式化文件大小
- *
- * @param size file.length() 获取文件大小
- * @return
- */
- public static String formatFileSize(double size) {
- double kiloByte = size / 1024;
- if (kiloByte < 1) {
- return size + "Byte(s)";
- }
-
- double megaByte = kiloByte / 1024;
- if (megaByte < 1) {
- BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
- return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
- }
-
- double gigaByte = megaByte / 1024;
- if (gigaByte < 1) {
- BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
- return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
- }
+ double megaByte = kiloByte / 1024;
+ if (megaByte < 1) {
+ BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
+ return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
+ }
- double teraBytes = gigaByte / 1024;
- if (teraBytes < 1) {
- BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
- return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
- }
- BigDecimal result4 = new BigDecimal(teraBytes);
- return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
+ double gigaByte = megaByte / 1024;
+ if (gigaByte < 1) {
+ BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
+ return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
}
- /**
- * 创建目录 当目录不存在的时候创建文件,否则返回false
- *
- * @param path
- * @return
- */
- public static boolean createDir(String path) {
- File file = new File(path);
- if (!file.exists()) {
- if (!file.mkdirs()) {
- Log.d(TAG, "创建失败,请检查路径和是否配置文件权限!");
- return false;
- }
- return true;
- }
+ double teraBytes = gigaByte / 1024;
+ if (teraBytes < 1) {
+ BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
+ return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
+ }
+ BigDecimal result4 = new BigDecimal(teraBytes);
+ return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
+ }
+
+ /**
+ * 创建目录 当目录不存在的时候创建文件,否则返回false
+ */
+ public static boolean createDir(String path) {
+ File file = new File(path);
+ if (!file.exists()) {
+ if (!file.mkdirs()) {
+ Log.d(TAG, "创建失败,请检查路径和是否配置文件权限!");
return false;
+ }
+ return true;
}
-
- /**
- * 创建文件 当文件不存在的时候就创建一个文件,否则直接返回文件
- *
- * @param path
- * @return
- */
- public static File createFile(String path) {
- File file = new File(path);
- if (!file.getParentFile().exists()) {
- Log.d(TAG, "目标文件所在路径不存在,准备创建……");
- if (!createDir(file.getParent())) {
- Log.d(TAG, "创建目录文件所在的目录失败!文件路径【" + path + "】");
- }
- }
- // 创建目标文件
- try {
- if (!file.exists()) {
- if (file.createNewFile()) {
- Log.d(TAG, "创建文件成功:" + file.getAbsolutePath());
- }
- return file;
- } else {
- return file;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
+ return false;
+ }
+
+ /**
+ * 创建文件 当文件不存在的时候就创建一个文件,否则直接返回文件
+ */
+ public static File createFile(String path) {
+ File file = new File(path);
+ if (!file.getParentFile().exists()) {
+ Log.d(TAG, "目标文件所在路径不存在,准备创建……");
+ if (!createDir(file.getParent())) {
+ Log.d(TAG, "创建目录文件所在的目录失败!文件路径【" + path + "】");
+ }
}
-
- /**
- * 设置打印的异常格式
- */
- public static String getPrintException(Throwable ex) {
- StringBuilder err = new StringBuilder();
- err.append("ExceptionDetailed:\n");
- err.append("====================Exception Info====================\n");
- err.append(ex.toString());
- err.append("\n");
- StackTraceElement[] stack = ex.getStackTrace();
- for (StackTraceElement stackTraceElement : stack) {
- err.append(stackTraceElement.toString()).append("\n");
+ // 创建目标文件
+ try {
+ if (!file.exists()) {
+ if (file.createNewFile()) {
+ Log.d(TAG, "创建文件成功:" + file.getAbsolutePath());
}
- Throwable cause = ex.getCause();
- if (cause != null) {
- err.append("【Caused by】: ");
- err.append(cause.toString());
- err.append("\n");
- StackTraceElement[] stackTrace = cause.getStackTrace();
- for (StackTraceElement stackTraceElement : stackTrace) {
- err.append(stackTraceElement.toString()).append("\n");
- }
- }
- err.append("===================================================");
- return err.toString();
+ return file;
+ } else {
+ return file;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
}
-
- /**
- * 读取下载配置文件
- *
- * @param file
- * @return
- */
- public static Properties loadConfig(File file) {
- Properties properties = new Properties();
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(file);
- properties.load(fis);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (fis != null) {
- fis.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
+ return null;
+ }
+
+ /**
+ * 设置打印的异常格式
+ */
+ public static String getPrintException(Throwable ex) {
+ StringBuilder err = new StringBuilder();
+ err.append("ExceptionDetailed:\n");
+ err.append("====================Exception Info====================\n");
+ err.append(ex.toString());
+ err.append("\n");
+ StackTraceElement[] stack = ex.getStackTrace();
+ for (StackTraceElement stackTraceElement : stack) {
+ err.append(stackTraceElement.toString()).append("\n");
+ }
+ Throwable cause = ex.getCause();
+ if (cause != null) {
+ err.append("【Caused by】: ");
+ err.append(cause.toString());
+ err.append("\n");
+ StackTraceElement[] stackTrace = cause.getStackTrace();
+ for (StackTraceElement stackTraceElement : stackTrace) {
+ err.append(stackTraceElement.toString()).append("\n");
+ }
+ }
+ err.append("===================================================");
+ return err.toString();
+ }
+
+ /**
+ * 读取下载配置文件
+ */
+ public static Properties loadConfig(File file) {
+ Properties properties = new Properties();
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(file);
+ properties.load(fis);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (fis != null) {
+ fis.close();
}
- return properties;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
-
- /**
- * 保存配置文件
- *
- * @param file
- * @param properties
- */
- public static void saveConfig(File file, Properties properties) {
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(file, false);
- properties.store(fos, null);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- if (fos != null) {
- fos.flush();
- fos.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
+ return properties;
+ }
+
+ /**
+ * 保存配置文件
+ */
+ public static void saveConfig(File file, Properties properties) {
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(file, false);
+ properties.store(fos, null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (fos != null) {
+ fos.flush();
+ fos.close();
}
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
+ }
}
diff --git a/downloadutil/src/main/res/values/strings.xml b/downloadutil/src/main/res/values/strings.xml
index 502c5311..fe69410b 100644
--- a/downloadutil/src/main/res/values/strings.xml
+++ b/downloadutil/src/main/res/values/strings.xml
@@ -1,8 +1,8 @@
- DownloadUtil
+ DownloadUtil
- 下载实体不能为空
- 下载链接不能为空
- 存储地址不能为空
- 文件名不能为空
+ 下载实体不能为空
+ 下载链接不能为空
+ 存储地址不能为空
+ 文件名不能为空
diff --git a/downloadutil/src/test/java/com/arialyy/downloadutil/ExampleUnitTest.java b/downloadutil/src/test/java/com/arialyy/downloadutil/ExampleUnitTest.java
index 753847a5..0fc8c02c 100644
--- a/downloadutil/src/test/java/com/arialyy/downloadutil/ExampleUnitTest.java
+++ b/downloadutil/src/test/java/com/arialyy/downloadutil/ExampleUnitTest.java
@@ -2,14 +2,13 @@ package com.arialyy.downloadutil;
import org.junit.Test;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
+ @Test public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
}
\ No newline at end of file