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