例子编写
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -37,7 +37,7 @@
|
|||||||
<ConfirmationsSetting value="0" id="Add" />
|
<ConfirmationsSetting value="0" id="Add" />
|
||||||
<ConfirmationsSetting value="0" id="Remove" />
|
<ConfirmationsSetting value="0" id="Remove" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
package com.arialyy.simple.activity;
|
package com.arialyy.simple.activity;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
|
||||||
import com.arialyy.simple.R;
|
import com.arialyy.simple.R;
|
||||||
|
import com.arialyy.simple.adapter.DownloadAdapter;
|
||||||
import com.arialyy.simple.base.BaseActivity;
|
import com.arialyy.simple.base.BaseActivity;
|
||||||
import com.arialyy.simple.databinding.ActivityMainBinding;
|
import com.arialyy.simple.databinding.ActivityMainBinding;
|
||||||
|
import com.arialyy.simple.module.DownloadModule;
|
||||||
|
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
|
|
||||||
@ -13,10 +17,16 @@ import butterknife.Bind;
|
|||||||
*/
|
*/
|
||||||
public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
||||||
@Bind(R.id.list) RecyclerView mList;
|
@Bind(R.id.list) RecyclerView mList;
|
||||||
|
DownloadAdapter mAdapter;
|
||||||
|
|
||||||
@Override protected int setLayoutId() {
|
@Override protected int setLayoutId() {
|
||||||
return R.layout.activity_main;
|
return R.layout.activity_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override protected void init(Bundle savedInstanceState) {
|
||||||
|
super.init(savedInstanceState);
|
||||||
|
mAdapter = new DownloadAdapter(this, getModule(DownloadModule.class).getDownloadData());
|
||||||
|
mList.setLayoutManager(new LinearLayoutManager(this));
|
||||||
|
mList.setAdapter(mAdapter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package com.arialyy.simple.activity;
|
package com.arialyy.simple.activity;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -11,13 +14,19 @@ import android.widget.ProgressBar;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.arialyy.downloadutil.core.DownloadManager;
|
||||||
|
import com.arialyy.downloadutil.core.command.CommandFactory;
|
||||||
|
import com.arialyy.downloadutil.core.command.IDownloadCommand;
|
||||||
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
import com.arialyy.downloadutil.util.DownLoadUtil;
|
import com.arialyy.downloadutil.util.DownLoadUtil;
|
||||||
import com.arialyy.downloadutil.util.Util;
|
import com.arialyy.downloadutil.util.Util;
|
||||||
import com.arialyy.simple.R;
|
import com.arialyy.simple.R;
|
||||||
import com.arialyy.simple.base.BaseActivity;
|
import com.arialyy.simple.base.BaseActivity;
|
||||||
import com.arialyy.simple.databinding.ActivitySimpleBinding;
|
import com.arialyy.simple.databinding.ActivitySimpleBinding;
|
||||||
|
import com.arialyy.simple.module.DownloadModule;
|
||||||
|
|
||||||
import java.net.HttpURLConnection;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
|
|
||||||
@ -58,7 +67,9 @@ public class SimpleTestActivity extends BaseActivity<ActivitySimpleBinding> {
|
|||||||
mStart.setText("开始");
|
mStart.setText("开始");
|
||||||
break;
|
break;
|
||||||
case DOWNLOAD_RESUME:
|
case DOWNLOAD_RESUME:
|
||||||
Toast.makeText(SimpleTestActivity.this, "恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj), Toast.LENGTH_SHORT).show();
|
Toast.makeText(SimpleTestActivity.this,
|
||||||
|
"恢复下载,恢复位置 ==> " + Util.formatFileSize((Long) msg.obj),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
mStart.setEnabled(false);
|
mStart.setEnabled(false);
|
||||||
break;
|
break;
|
||||||
case DOWNLOAD_COMPLETE:
|
case DOWNLOAD_COMPLETE:
|
||||||
@ -71,12 +82,27 @@ public class SimpleTestActivity extends BaseActivity<ActivitySimpleBinding> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
|
@Override public void onReceive(Context context, Intent intent) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override protected void onCreate(Bundle savedInstanceState) {
|
@Override protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
unregisterReceiver(mReceiver);
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected int setLayoutId() {
|
@Override protected int setLayoutId() {
|
||||||
return R.layout.activity_simple;
|
return R.layout.activity_simple;
|
||||||
}
|
}
|
||||||
@ -111,58 +137,19 @@ public class SimpleTestActivity extends BaseActivity<ActivitySimpleBinding> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void start() {
|
private void start() {
|
||||||
mUtil.download(this, mDownloadUrl, Environment.getExternalStorageDirectory().getPath() + "/test.apk", new DownLoadUtil.DownloadListener() {
|
DownloadEntity entity = new DownloadEntity();
|
||||||
long fileSize = 1;
|
entity.setFileName("test.apk");
|
||||||
|
entity.setDownloadUrl(mDownloadUrl);
|
||||||
|
entity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk");
|
||||||
|
List<IDownloadCommand> commands = new ArrayList<>();
|
||||||
|
IDownloadCommand addCommand = CommandFactory.getInstance()
|
||||||
|
.createCommand(this, entity, CommandFactory.TASK_CREATE);
|
||||||
|
IDownloadCommand startCommand = CommandFactory.getInstance()
|
||||||
|
.createCommand(this, entity, CommandFactory.TASK_START);
|
||||||
|
commands.add(addCommand);
|
||||||
|
commands.add(startCommand);
|
||||||
|
DownloadManager.getInstance(this).setCommands(commands).exe();
|
||||||
|
|
||||||
@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() {
|
private void stop() {
|
||||||
|
@ -1,21 +1,66 @@
|
|||||||
//package com.arialyy.simple.module;
|
package com.arialyy.simple.module;
|
||||||
//
|
|
||||||
//import android.content.Context;
|
import android.content.Context;
|
||||||
//import com.arialyy.downloadutil.entity.DownloadEntity;
|
import android.content.IntentFilter;
|
||||||
//import com.arialyy.simple.base.BaseModule;
|
import android.os.Environment;
|
||||||
//import java.util.ArrayList;
|
|
||||||
//import java.util.List;
|
import com.arialyy.downloadutil.core.DownloadManager;
|
||||||
//
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
///**
|
import com.arialyy.frame.util.AndroidUtils;
|
||||||
// * Created by Lyy on 2016/9/27.
|
import com.arialyy.frame.util.StringUtil;
|
||||||
// */
|
import com.arialyy.simple.R;
|
||||||
//public class DownloadModule extends BaseModule{
|
import com.arialyy.simple.base.BaseModule;
|
||||||
// public DownloadModule(Context context) {
|
|
||||||
// super(context);
|
import java.util.ArrayList;
|
||||||
// }
|
import java.util.List;
|
||||||
//
|
|
||||||
// public List<DownloadEntity> getDownloadData(){
|
/**
|
||||||
// List<DownloadEntity> list = new ArrayList<>();
|
* Created by Lyy on 2016/9/27.
|
||||||
// DownloadEntity entity
|
*/
|
||||||
// }
|
public class DownloadModule extends BaseModule {
|
||||||
//}
|
public DownloadModule(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置下载数据
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<DownloadEntity> getDownloadData() {
|
||||||
|
List<DownloadEntity> list = new ArrayList<>();
|
||||||
|
String[] urls = getContext().getResources()
|
||||||
|
.getStringArray(R.array.test_apk_download_url);
|
||||||
|
for (String url : urls) {
|
||||||
|
String fileName = StringUtil.keyToHashKey(url) + ".apk";
|
||||||
|
DownloadEntity entity = new DownloadEntity();
|
||||||
|
entity.setDownloadUrl(url);
|
||||||
|
entity.setDownloadPath(getDownloadPath(url));
|
||||||
|
entity.setFileName(fileName);
|
||||||
|
list.add(entity);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载广播过滤器
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public IntentFilter getDownloadFilter(){
|
||||||
|
IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addCategory(getContext().getPackageName());
|
||||||
|
filter.addAction(DownloadManager.ACTION_PRE);
|
||||||
|
filter.addAction(DownloadManager.ACTION_RESUME);
|
||||||
|
filter.addAction(DownloadManager.ACTION_START);
|
||||||
|
filter.addAction(DownloadManager.ACTION_RUNNING);
|
||||||
|
filter.addAction(DownloadManager.ACTION_STOP);
|
||||||
|
filter.addAction(DownloadManager.ACTION_CANCEL);
|
||||||
|
filter.addAction(DownloadManager.ACTION_COMPLETE);
|
||||||
|
filter.addAction(DownloadManager.ACTION_FAIL);
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDownloadPath(String url) {
|
||||||
|
return Environment.getExternalStorageDirectory().getPath() + "/" + AndroidUtils.getAppName(
|
||||||
|
getContext()) + "downloads/" + StringUtil.keyToHashKey(url) + ".apk";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -32,11 +32,13 @@ public class HorizontalProgressBarWithNumber extends ProgressBar {
|
|||||||
/**
|
/**
|
||||||
* offset of draw progress
|
* offset of draw progress
|
||||||
*/
|
*/
|
||||||
protected int mTextOffset = dp2px(DEFAULT_SIZE_TEXT_OFFSET);
|
protected int mTextOffset = dp2px(
|
||||||
|
DEFAULT_SIZE_TEXT_OFFSET);
|
||||||
/**
|
/**
|
||||||
* height of reached progress bar
|
* height of reached progress bar
|
||||||
*/
|
*/
|
||||||
protected int mReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_REACHED_PROGRESS_BAR);
|
protected int mReachedProgressBarHeight = dp2px(
|
||||||
|
DEFAULT_HEIGHT_REACHED_PROGRESS_BAR);
|
||||||
/**
|
/**
|
||||||
* color of reached bar
|
* color of reached bar
|
||||||
*/
|
*/
|
||||||
@ -48,7 +50,8 @@ public class HorizontalProgressBarWithNumber extends ProgressBar {
|
|||||||
/**
|
/**
|
||||||
* height of unreached progress bar
|
* height of unreached progress bar
|
||||||
*/
|
*/
|
||||||
protected int mUnReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR);
|
protected int mUnReachedProgressBarHeight = dp2px(
|
||||||
|
DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR);
|
||||||
/**
|
/**
|
||||||
* view width except padding
|
* view width except padding
|
||||||
*/
|
*/
|
||||||
@ -82,7 +85,10 @@ public class HorizontalProgressBarWithNumber extends ProgressBar {
|
|||||||
result = specSize;
|
result = specSize;
|
||||||
} else {
|
} else {
|
||||||
float textHeight = (mPaint.descent() - mPaint.ascent());
|
float textHeight = (mPaint.descent() - mPaint.ascent());
|
||||||
result = (int) (getPaddingTop() + getPaddingBottom() + Math.max(Math.max(mReachedProgressBarHeight, mUnReachedProgressBarHeight), Math.abs(textHeight)));
|
result = (int) (getPaddingTop() + getPaddingBottom() + Math.max(
|
||||||
|
Math.max(mReachedProgressBarHeight, mUnReachedProgressBarHeight),
|
||||||
|
Math.abs(textHeight))
|
||||||
|
);
|
||||||
if (specMode == MeasureSpec.AT_MOST) {
|
if (specMode == MeasureSpec.AT_MOST) {
|
||||||
result = Math.min(result, specSize);
|
result = Math.min(result, specSize);
|
||||||
}
|
}
|
||||||
@ -95,15 +101,28 @@ public class HorizontalProgressBarWithNumber extends ProgressBar {
|
|||||||
*/
|
*/
|
||||||
private void obtainStyledAttributes(AttributeSet attrs) {
|
private void obtainStyledAttributes(AttributeSet attrs) {
|
||||||
// init values from custom attributes
|
// init values from custom attributes
|
||||||
final TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.HorizontalProgressBarWithNumber);
|
final TypedArray attributes = getContext().obtainStyledAttributes(attrs,
|
||||||
mTextColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_text_color, DEFAULT_TEXT_COLOR);
|
R.styleable.HorizontalProgressBarWithNumber);
|
||||||
mTextSize = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_text_size, mTextSize);
|
mTextColor = attributes.getColor(
|
||||||
mReachedBarColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, mTextColor);
|
R.styleable.HorizontalProgressBarWithNumber_progress_text_color,
|
||||||
mUnReachedBarColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color, DEFAULT_COLOR_UNREACHED_COLOR);
|
DEFAULT_TEXT_COLOR);
|
||||||
mReachedProgressBarHeight = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height, mReachedProgressBarHeight);
|
mTextSize = (int) attributes.getDimension(
|
||||||
mUnReachedProgressBarHeight = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height, mUnReachedProgressBarHeight);
|
R.styleable.HorizontalProgressBarWithNumber_progress_text_size, mTextSize);
|
||||||
mTextOffset = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_text_offset, mTextOffset);
|
mReachedBarColor = attributes.getColor(
|
||||||
int textVisible = attributes.getInt(R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, VISIBLE);
|
R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, mTextColor);
|
||||||
|
mUnReachedBarColor = attributes.getColor(
|
||||||
|
R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color,
|
||||||
|
DEFAULT_COLOR_UNREACHED_COLOR);
|
||||||
|
mReachedProgressBarHeight = (int) attributes.getDimension(
|
||||||
|
R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height,
|
||||||
|
mReachedProgressBarHeight);
|
||||||
|
mUnReachedProgressBarHeight = (int) attributes.getDimension(
|
||||||
|
R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height,
|
||||||
|
mUnReachedProgressBarHeight);
|
||||||
|
mTextOffset = (int) attributes.getDimension(
|
||||||
|
R.styleable.HorizontalProgressBarWithNumber_progress_text_offset, mTextOffset);
|
||||||
|
int textVisible = attributes.getInt(
|
||||||
|
R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, VISIBLE);
|
||||||
if (textVisible != VISIBLE) {
|
if (textVisible != VISIBLE) {
|
||||||
mIfDrawText = false;
|
mIfDrawText = false;
|
||||||
}
|
}
|
||||||
@ -151,13 +170,15 @@ public class HorizontalProgressBarWithNumber extends ProgressBar {
|
|||||||
* dp 2 px
|
* dp 2 px
|
||||||
*/
|
*/
|
||||||
protected int dp2px(int dpVal) {
|
protected int dp2px(int dpVal) {
|
||||||
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics());
|
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal,
|
||||||
|
getResources().getDisplayMetrics());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sp 2 px
|
* sp 2 px
|
||||||
*/
|
*/
|
||||||
protected int sp2px(int spVal) {
|
protected int sp2px(int spVal) {
|
||||||
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, getResources().getDisplayMetrics());
|
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal,
|
||||||
|
getResources().getDisplayMetrics());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,18 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">DownloadDemo</string>
|
<string name="app_name">DownloadDemo</string>
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
|
|
||||||
|
<string-array name="test_apk_download_url">
|
||||||
|
<item>http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk</item> <!--300M的文件-->
|
||||||
|
<item>http://static.gaoshouyou.com/d/21/e8/61218d78d0e8b79df68dbc18dd484c97.apk</item>
|
||||||
|
<item>http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk</item>
|
||||||
|
<item>http://static.gaoshouyou.com/d/d4/4f/d6d48db3794fb9ecf47e83c346570881.apk</item>
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/18/cf/ba18113bc6cf56c1c5863e761e717003.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/60/17/2460921367173ea7145f11194a6f2587.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/32/e0/1a32123ecbe0ee010d35479df248f90f.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/e6/f5/4de6329f9cf5dc3a1d1e6bbcca0d003c.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/6e/e5/ff6ecaaf45e532e6d07747af82357472.apk</item>-->
|
||||||
|
<!--<item>http://static.gaoshouyou.com/d/36/69/2d3699acfa69e9632262442c46516ad8.apk</item>-->
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package com.arialyy.downloadutil.core;
|
package com.arialyy.downloadutil.core;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.core.command.IDownloadCommand;
|
import com.arialyy.downloadutil.core.command.IDownloadCommand;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -93,10 +95,11 @@ public class DownloadManager {
|
|||||||
/**
|
/**
|
||||||
* 设置一组命令
|
* 设置一组命令
|
||||||
*/
|
*/
|
||||||
public void setCommands(List<IDownloadCommand> commands) {
|
public DownloadManager setCommands(List<IDownloadCommand> commands) {
|
||||||
if (commands != null && commands.size() > 0) {
|
if (commands != null && commands.size() > 0) {
|
||||||
mCommands.addAll(commands);
|
mCommands.addAll(commands);
|
||||||
}
|
}
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,6 +2,7 @@ package com.arialyy.downloadutil.core;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -87,12 +88,18 @@ public class DownloadTarget extends IDownloadTarget {
|
|||||||
@Override public void removeTask(DownloadEntity entity) {
|
@Override public void removeTask(DownloadEntity entity) {
|
||||||
Task task = mCachePool.getTask(entity.getDownloadUrl());
|
Task task = mCachePool.getTask(entity.getDownloadUrl());
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
|
Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ?
|
||||||
|
"成功" :
|
||||||
|
"失败"
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
task = mExecutePool.getTask(entity.getDownloadUrl());
|
task = mExecutePool.getTask(entity.getDownloadUrl());
|
||||||
}
|
}
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
|
Log.d(TAG, "任务删除" + (mCachePool.removeTask(task) ?
|
||||||
|
"成功" :
|
||||||
|
"失败"
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的任务");
|
Log.w(TAG, "没有找到下载链接为【" + entity.getDownloadUrl() + "】的任务");
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package com.arialyy.downloadutil.core;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.core.inf.IDownloader;
|
import com.arialyy.downloadutil.core.inf.IDownloader;
|
||||||
import com.arialyy.downloadutil.core.inf.ITask;
|
import com.arialyy.downloadutil.core.inf.ITask;
|
||||||
import com.arialyy.downloadutil.core.pool.CachePool;
|
import com.arialyy.downloadutil.core.pool.CachePool;
|
||||||
|
@ -4,9 +4,11 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
import com.arialyy.downloadutil.util.DownLoadUtil;
|
import com.arialyy.downloadutil.util.DownLoadUtil;
|
||||||
import com.arialyy.downloadutil.util.IDownloadListener;
|
import com.arialyy.downloadutil.util.IDownloadListener;
|
||||||
|
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,8 +38,8 @@ public class Task {
|
|||||||
if (listener == null) {
|
if (listener == null) {
|
||||||
listener = new DownloadListener(context, downloadEntity, outHandler);
|
listener = new DownloadListener(context, downloadEntity, outHandler);
|
||||||
}
|
}
|
||||||
util.download(context, downloadEntity.getDownloadUrl(), downloadEntity.getDownloadPath(),
|
util.download(context, downloadEntity.getDownloadUrl(),
|
||||||
listener);
|
downloadEntity.getDownloadPath(), listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +81,8 @@ public class Task {
|
|||||||
long lastLen = 0; //上一次发送长度
|
long lastLen = 0; //上一次发送长度
|
||||||
DownloadEntity downloadEntity;
|
DownloadEntity downloadEntity;
|
||||||
|
|
||||||
public DownloadListener(Context context, DownloadEntity downloadEntity, Handler outHandler) {
|
public DownloadListener(Context context, DownloadEntity downloadEntity,
|
||||||
|
Handler outHandler) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.outHandler = outHandler;
|
this.outHandler = outHandler;
|
||||||
this.downloadEntity = downloadEntity;
|
this.downloadEntity = downloadEntity;
|
||||||
|
@ -2,6 +2,7 @@ package com.arialyy.downloadutil.core;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.core.DownloadTarget;
|
import com.arialyy.downloadutil.core.DownloadTarget;
|
||||||
import com.arialyy.downloadutil.core.IDownloadTarget;
|
import com.arialyy.downloadutil.core.IDownloadTarget;
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.core.command;
|
package com.arialyy.downloadutil.core.command;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,9 +2,11 @@ package com.arialyy.downloadutil.core.pool;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.core.Task;
|
import com.arialyy.downloadutil.core.Task;
|
||||||
import com.arialyy.downloadutil.core.inf.IPool;
|
import com.arialyy.downloadutil.core.inf.IPool;
|
||||||
import com.arialyy.downloadutil.util.Util;
|
import com.arialyy.downloadutil.util.Util;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.PriorityQueue;
|
import java.util.PriorityQueue;
|
||||||
@ -47,7 +49,10 @@ public class CachePool implements IPool {
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
boolean s = mCacheQueue.offer(task);
|
boolean s = mCacheQueue.offer(task);
|
||||||
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
Log.w(TAG, "任务添加" + (s ?
|
||||||
|
"成功" :
|
||||||
|
"失败,【" + url + "】"
|
||||||
|
));
|
||||||
if (s) {
|
if (s) {
|
||||||
mCacheArray.put(Util.keyToHashKey(url), task);
|
mCacheArray.put(Util.keyToHashKey(url), task);
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,11 @@ package com.arialyy.downloadutil.core.pool;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.core.Task;
|
import com.arialyy.downloadutil.core.Task;
|
||||||
import com.arialyy.downloadutil.core.inf.IPool;
|
import com.arialyy.downloadutil.core.inf.IPool;
|
||||||
import com.arialyy.downloadutil.util.Util;
|
import com.arialyy.downloadutil.util.Util;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
@ -68,7 +70,10 @@ public class ExecutePool implements IPool {
|
|||||||
private boolean putNewTask(Task newTask) {
|
private boolean putNewTask(Task newTask) {
|
||||||
String url = newTask.getDownloadEntity().getDownloadUrl();
|
String url = newTask.getDownloadEntity().getDownloadUrl();
|
||||||
boolean s = mExecuteQueue.offer(newTask);
|
boolean s = mExecuteQueue.offer(newTask);
|
||||||
Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
Log.w(TAG, "任务添加" + (s ?
|
||||||
|
"成功" :
|
||||||
|
"失败,【" + url + "】"
|
||||||
|
));
|
||||||
if (s) {
|
if (s) {
|
||||||
newTask.start();
|
newTask.start();
|
||||||
mExecuteArray.put(Util.keyToHashKey(url), newTask);
|
mExecuteArray.put(Util.keyToHashKey(url), newTask);
|
||||||
|
@ -2,6 +2,7 @@ package com.arialyy.downloadutil.entity;
|
|||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.orm.DbEntity;
|
import com.arialyy.downloadutil.orm.DbEntity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -146,7 +147,9 @@ public class DownloadEntity extends DbEntity implements Parcelable, Cloneable {
|
|||||||
dest.writeLong(this.completeTime);
|
dest.writeLong(this.completeTime);
|
||||||
dest.writeLong(this.fileSize);
|
dest.writeLong(this.fileSize);
|
||||||
dest.writeInt(this.state);
|
dest.writeInt(this.state);
|
||||||
dest.writeByte(this.isDownloadComplete ? (byte) 1 : (byte) 0);
|
dest.writeByte(this.isDownloadComplete ?
|
||||||
|
(byte) 1 :
|
||||||
|
(byte) 0);
|
||||||
dest.writeLong(this.currentProgress);
|
dest.writeLong(this.currentProgress);
|
||||||
dest.writeInt(this.failNum);
|
dest.writeInt(this.failNum);
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@ package com.arialyy.downloadutil.help;
|
|||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.R;
|
import com.arialyy.downloadutil.R;
|
||||||
import com.arialyy.downloadutil.entity.DownloadEntity;
|
import com.arialyy.downloadutil.entity.DownloadEntity;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,7 +33,7 @@ public class CheckHelp {
|
|||||||
Log.w(TAG, Resources.getSystem().getString(R.string.error_file_name_null));
|
Log.w(TAG, Resources.getSystem().getString(R.string.error_file_name_null));
|
||||||
return false;
|
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));
|
Log.w(TAG, Resources.getSystem().getString(R.string.error_download_path_null));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String fileName = entity.getFileName();
|
String fileName = entity.getFileName();
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package com.arialyy.downloadutil.help;
|
||||||
|
|
||||||
|
import android.os.Environment;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by lyy on 2016/9/27.
|
||||||
|
* 下载路径帮助类
|
||||||
|
*/
|
||||||
|
public class PathHelp {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载链接转换保存路径
|
||||||
|
*
|
||||||
|
* @param downloadUrl 下载链接
|
||||||
|
* @return 保存路径
|
||||||
|
*/
|
||||||
|
public static String urlconvertPath(String downloadUrl) {
|
||||||
|
return Environment.getDownloadCacheDirectory().getPath() + "/" + StringToHashKey(
|
||||||
|
downloadUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串转换为hash码
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String StringToHashKey(String str) {
|
||||||
|
String cacheKey;
|
||||||
|
try {
|
||||||
|
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
|
||||||
|
mDigest.update(str.getBytes());
|
||||||
|
cacheKey = bytesToHexString(mDigest.digest());
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
cacheKey = String.valueOf(str.hashCode());
|
||||||
|
}
|
||||||
|
return cacheKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将普通字符串转换为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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,7 +4,9 @@ import android.content.Context;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.util.Util;
|
import com.arialyy.downloadutil.util.Util;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
@ -108,7 +110,9 @@ public class DbEntity {
|
|||||||
*/
|
*/
|
||||||
public <T extends DbEntity> List<T> findAllData(Class<T> clazz) {
|
public <T extends DbEntity> List<T> findAllData(Class<T> clazz) {
|
||||||
Cursor cursor = mUtil.findAllData(this);
|
Cursor cursor = mUtil.findAllData(this);
|
||||||
return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
|
return cursor.getCount() > 0 ?
|
||||||
|
newInstanceEntity(clazz, cursor) :
|
||||||
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,7 +123,9 @@ public class DbEntity {
|
|||||||
public <T extends DbEntity> List<T> findDatas(Class<T> clazz, @NonNull Object[] wheres,
|
public <T extends DbEntity> List<T> findDatas(Class<T> clazz, @NonNull Object[] wheres,
|
||||||
@NonNull Object[] values) {
|
@NonNull Object[] values) {
|
||||||
Cursor cursor = mUtil.findData(this, wheres, values);
|
Cursor cursor = mUtil.findData(this, wheres, values);
|
||||||
return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null;
|
return cursor.getCount() > 0 ?
|
||||||
|
newInstanceEntity(clazz, cursor) :
|
||||||
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,7 +136,9 @@ public class DbEntity {
|
|||||||
public <T extends DbEntity> T findData(Class<T> clazz, @NonNull Object[] wheres,
|
public <T extends DbEntity> T findData(Class<T> clazz, @NonNull Object[] wheres,
|
||||||
@NonNull Object[] values) {
|
@NonNull Object[] values) {
|
||||||
Cursor cursor = mUtil.findData(this, wheres, values);
|
Cursor cursor = mUtil.findData(this, wheres, values);
|
||||||
return cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor).get(0) : null;
|
return cursor.getCount() > 0 ?
|
||||||
|
newInstanceEntity(clazz, cursor).get(0) :
|
||||||
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -142,8 +150,10 @@ public class DbEntity {
|
|||||||
if (fields != null && fields.length > 0) {
|
if (fields != null && fields.length > 0) {
|
||||||
try {
|
try {
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
Class[] paramTypes = { Context.class, boolean.class };
|
Class[] paramTypes = {Context.class,
|
||||||
Object[] params = { mContext, false };
|
boolean.class};
|
||||||
|
Object[] params = {mContext,
|
||||||
|
false};
|
||||||
Constructor<T> con = clazz.getConstructor(paramTypes);
|
Constructor<T> con = clazz.getConstructor(paramTypes);
|
||||||
T entity = con.newInstance(params);
|
T entity = con.newInstance(params);
|
||||||
for (Field field : fields) {
|
for (Field field : fields) {
|
||||||
@ -165,7 +175,8 @@ public class DbEntity {
|
|||||||
} else if (type == long.class || type == Long.class) {
|
} else if (type == long.class || type == Long.class) {
|
||||||
field.setLong(entity, cursor.getLong(column));
|
field.setLong(entity, cursor.getLong(column));
|
||||||
} else if (type == boolean.class || type == Boolean.class) {
|
} else if (type == boolean.class || type == Boolean.class) {
|
||||||
field.setBoolean(entity, !cursor.getString(column).equalsIgnoreCase("false"));
|
field.setBoolean(entity,
|
||||||
|
!cursor.getString(column).equalsIgnoreCase("false"));
|
||||||
} else if (type == java.util.Date.class || type == java.sql.Date.class) {
|
} else if (type == java.util.Date.class || type == java.sql.Date.class) {
|
||||||
field.set(entity, new Date(cursor.getString(column)));
|
field.set(entity, new Date(cursor.getString(column)));
|
||||||
} else if (type == byte[].class) {
|
} else if (type == byte[].class) {
|
||||||
|
@ -4,7 +4,9 @@ import android.database.Cursor;
|
|||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arialyy.downloadutil.util.Util;
|
import com.arialyy.downloadutil.util.Util;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,7 +62,9 @@ public class DbUtil {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (Object where : wheres) {
|
for (Object where : wheres) {
|
||||||
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
||||||
sb.append(i >= wheres.length - 1 ? "" : ",");
|
sb.append(i >= wheres.length - 1 ?
|
||||||
|
"" :
|
||||||
|
",");
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
print(DEL_DATA, sb.toString());
|
print(DEL_DATA, sb.toString());
|
||||||
@ -83,7 +87,9 @@ public class DbUtil {
|
|||||||
if (ignore != null && ignore.value()) {
|
if (ignore != null && ignore.value()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sb.append(i > 0 ? ", " : "");
|
sb.append(i > 0 ?
|
||||||
|
", " :
|
||||||
|
"");
|
||||||
try {
|
try {
|
||||||
sb.append(field.getName())
|
sb.append(field.getName())
|
||||||
.append(" = '")
|
.append(" = '")
|
||||||
@ -112,7 +118,8 @@ public class DbUtil {
|
|||||||
/**
|
/**
|
||||||
* 条件查寻数据
|
* 条件查寻数据
|
||||||
*/
|
*/
|
||||||
protected Cursor findData(DbEntity dbEntity, @NonNull Object[] wheres, @NonNull Object[] values) {
|
protected Cursor findData(DbEntity dbEntity, @NonNull Object[] wheres,
|
||||||
|
@NonNull Object[] values) {
|
||||||
if (wheres.length <= 0 || values.length <= 0) {
|
if (wheres.length <= 0 || values.length <= 0) {
|
||||||
Log.e(TAG, "请输入查询条件");
|
Log.e(TAG, "请输入查询条件");
|
||||||
return null;
|
return null;
|
||||||
@ -125,7 +132,9 @@ public class DbUtil {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (Object where : wheres) {
|
for (Object where : wheres) {
|
||||||
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
||||||
sb.append(i >= wheres.length - 1 ? "" : ", ");
|
sb.append(i >= wheres.length - 1 ?
|
||||||
|
"" :
|
||||||
|
", ");
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
print(FIND_DATA, sb.toString());
|
print(FIND_DATA, sb.toString());
|
||||||
@ -148,7 +157,9 @@ public class DbUtil {
|
|||||||
if (ignore != null && ignore.value()) {
|
if (ignore != null && ignore.value()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sb.append(i > 0 ? ", " : "");
|
sb.append(i > 0 ?
|
||||||
|
", " :
|
||||||
|
"");
|
||||||
sb.append(field.getName());
|
sb.append(field.getName());
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -160,7 +171,9 @@ public class DbUtil {
|
|||||||
if (ignore != null && ignore.value()) {
|
if (ignore != null && ignore.value()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sb.append(i > 0 ? ", " : "");
|
sb.append(i > 0 ?
|
||||||
|
", " :
|
||||||
|
"");
|
||||||
sb.append("'");
|
sb.append("'");
|
||||||
try {
|
try {
|
||||||
sb.append(field.get(dbEntity)).append("'");
|
sb.append(field.get(dbEntity)).append("'");
|
||||||
@ -238,7 +251,9 @@ public class DbUtil {
|
|||||||
} else {
|
} else {
|
||||||
sb.append(" blob");
|
sb.append(" blob");
|
||||||
}
|
}
|
||||||
sb.append(i >= fields.length - ignoreNum - 1 ? "" : ", ");
|
sb.append(i >= fields.length - ignoreNum - 1 ?
|
||||||
|
"" :
|
||||||
|
", ");
|
||||||
}
|
}
|
||||||
sb.append(");");
|
sb.append(");");
|
||||||
print(CREATE_TABLE, sb.toString());
|
print(CREATE_TABLE, sb.toString());
|
||||||
@ -310,7 +325,9 @@ public class DbUtil {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (Object where : wheres) {
|
for (Object where : wheres) {
|
||||||
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
sb.append(where).append("=").append("'").append(values[i]).append("'");
|
||||||
sb.append(i >= wheres.length - 1 ? "" : ",");
|
sb.append(i >= wheres.length - 1 ?
|
||||||
|
"" :
|
||||||
|
",");
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
print(ROW_ID, sb.toString());
|
print(ROW_ID, sb.toString());
|
||||||
|
@ -4,6 +4,7 @@ import android.content.Context;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@ -79,7 +80,8 @@ public class DownLoadUtil {
|
|||||||
* @param downloadListener 下载进度监听 {@link DownloadListener}
|
* @param downloadListener 下载进度监听 {@link DownloadListener}
|
||||||
*/
|
*/
|
||||||
public void download(final Context context, @NonNull final String downloadUrl,
|
public void download(final Context context, @NonNull final String downloadUrl,
|
||||||
@NonNull final String filePath, @NonNull final IDownloadListener downloadListener) {
|
@NonNull final String filePath,
|
||||||
|
@NonNull final IDownloadListener downloadListener) {
|
||||||
isDownloading = true;
|
isDownloading = true;
|
||||||
mCurrentLocation = 0;
|
mCurrentLocation = 0;
|
||||||
isStop = false;
|
isStop = false;
|
||||||
@ -88,8 +90,8 @@ public class DownLoadUtil {
|
|||||||
mStopNum = 0;
|
mStopNum = 0;
|
||||||
final File dFile = new File(filePath);
|
final File dFile = new File(filePath);
|
||||||
//读取已完成的线程数
|
//读取已完成的线程数
|
||||||
final File configFile =
|
final File configFile = new File(
|
||||||
new File(context.getFilesDir().getPath() + "/temp/" + dFile.getName() + ".properties");
|
context.getFilesDir().getPath() + "/temp/" + dFile.getName() + ".properties");
|
||||||
try {
|
try {
|
||||||
if (!configFile.exists()) { //记录文件被删除,则重新下载
|
if (!configFile.exists()) { //记录文件被删除,则重新下载
|
||||||
isNewTask = true;
|
isNewTask = true;
|
||||||
@ -175,9 +177,8 @@ public class DownLoadUtil {
|
|||||||
}
|
}
|
||||||
//分配下载位置
|
//分配下载位置
|
||||||
Object record = pro.getProperty(dFile.getName() + "_record_" + i);
|
Object record = pro.getProperty(dFile.getName() + "_record_" + i);
|
||||||
if (!isNewTask
|
if (!isNewTask && record != null && Long.parseLong(
|
||||||
&& record != null
|
record + "") > 0) { //如果有记录,则恢复下载
|
||||||
&& Long.parseLong(record + "") > 0) { //如果有记录,则恢复下载
|
|
||||||
Long r = Long.parseLong(record + "");
|
Long r = Long.parseLong(record + "");
|
||||||
mCurrentLocation += r - startL;
|
mCurrentLocation += r - startL;
|
||||||
Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
|
Log.d(TAG, "++++++++++ 线程_" + i + "_恢复下载 ++++++++++");
|
||||||
@ -195,8 +196,8 @@ public class DownLoadUtil {
|
|||||||
if (i == (THREAD_NUM - 1)) {
|
if (i == (THREAD_NUM - 1)) {
|
||||||
endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度
|
endL = fileLength;//如果整个文件的大小不为线程个数的整数倍,则最后一个线程的结束位置即为文件的总长度
|
||||||
}
|
}
|
||||||
DownloadEntity entity =
|
DownloadEntity entity = new DownloadEntity(context, fileLength,
|
||||||
new DownloadEntity(context, fileLength, downloadUrl, dFile, i, startL, endL);
|
downloadUrl, dFile, i, startL, endL);
|
||||||
DownLoadTask task = new DownLoadTask(entity);
|
DownLoadTask task = new DownLoadTask(entity);
|
||||||
tasks.put(i, new Thread(task));
|
tasks.put(i, new Thread(task));
|
||||||
}
|
}
|
||||||
@ -216,12 +217,9 @@ public class DownLoadUtil {
|
|||||||
failDownload("下载失败,返回码:" + code);
|
failDownload("下载失败,返回码:" + code);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
failDownload("下载失败【downloadUrl:"
|
failDownload(
|
||||||
+ downloadUrl
|
"下载失败【downloadUrl:" + downloadUrl + "】\n【filePath:" + filePath + "】" + Util
|
||||||
+ "】\n【filePath:"
|
.getPrintException(e));
|
||||||
+ filePath
|
|
||||||
+ "】"
|
|
||||||
+ Util.getPrintException(e));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
@ -245,23 +243,15 @@ public class DownLoadUtil {
|
|||||||
|
|
||||||
public DownLoadTask(DownloadEntity downloadInfo) {
|
public DownLoadTask(DownloadEntity downloadInfo) {
|
||||||
this.dEntity = downloadInfo;
|
this.dEntity = downloadInfo;
|
||||||
configFPath = dEntity.context.getFilesDir().getPath()
|
configFPath = dEntity.context.getFilesDir()
|
||||||
+ "/temp/"
|
.getPath() + "/temp/" + dEntity.tempFile.getName() + ".properties";
|
||||||
+ dEntity.tempFile.getName()
|
|
||||||
+ ".properties";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
long currentLocation = 0;
|
long currentLocation = 0;
|
||||||
try {
|
try {
|
||||||
Log.d(TAG, "线程_"
|
Log.d(TAG,
|
||||||
+ dEntity.threadId
|
"线程_" + dEntity.threadId + "_正在下载【" + "开始位置 : " + dEntity.startLocation + ",结束位置:" + dEntity.endLocation + "】");
|
||||||
+ "_正在下载【"
|
|
||||||
+ "开始位置 : "
|
|
||||||
+ dEntity.startLocation
|
|
||||||
+ ",结束位置:"
|
|
||||||
+ dEntity.endLocation
|
|
||||||
+ "】");
|
|
||||||
URL url = new URL(dEntity.downloadUrl);
|
URL url = new URL(dEntity.downloadUrl);
|
||||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||||
//在头里面请求下载开始位置和结束位置
|
//在头里面请求下载开始位置和结束位置
|
||||||
@ -328,7 +318,8 @@ public class DownLoadUtil {
|
|||||||
String location = String.valueOf(currentLocation);
|
String location = String.valueOf(currentLocation);
|
||||||
Log.i(TAG,
|
Log.i(TAG,
|
||||||
"thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation);
|
"thread_" + dEntity.threadId + "_stop, stop location ==> " + currentLocation);
|
||||||
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
|
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
|
||||||
|
location);
|
||||||
if (mStopNum == THREAD_NUM) {
|
if (mStopNum == THREAD_NUM) {
|
||||||
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
Log.d(TAG, "++++++++++++++++ onStop +++++++++++++++++");
|
||||||
isDownloading = false;
|
isDownloading = false;
|
||||||
@ -357,7 +348,8 @@ public class DownLoadUtil {
|
|||||||
synchronized (DownLoadUtil.this) {
|
synchronized (DownLoadUtil.this) {
|
||||||
try {
|
try {
|
||||||
String location = String.valueOf(currentLocation);
|
String location = String.valueOf(currentLocation);
|
||||||
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
|
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
|
||||||
|
location);
|
||||||
failDownload("下载链接异常");
|
failDownload("下载链接异常");
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
e1.printStackTrace();
|
e1.printStackTrace();
|
||||||
@ -367,8 +359,10 @@ public class DownLoadUtil {
|
|||||||
synchronized (DownLoadUtil.this) {
|
synchronized (DownLoadUtil.this) {
|
||||||
try {
|
try {
|
||||||
String location = String.valueOf(currentLocation);
|
String location = String.valueOf(currentLocation);
|
||||||
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
|
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
|
||||||
failDownload("下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e));
|
location);
|
||||||
|
failDownload(
|
||||||
|
"下载失败【" + dEntity.downloadUrl + "】" + Util.getPrintException(e));
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
e1.printStackTrace();
|
e1.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -377,7 +371,8 @@ public class DownLoadUtil {
|
|||||||
synchronized (DownLoadUtil.this) {
|
synchronized (DownLoadUtil.this) {
|
||||||
try {
|
try {
|
||||||
String location = String.valueOf(currentLocation);
|
String location = String.valueOf(currentLocation);
|
||||||
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId, location);
|
writeConfig(dEntity.tempFile.getName() + "_record_" + dEntity.threadId,
|
||||||
|
location);
|
||||||
failDownload("获取流失败" + Util.getPrintException(e));
|
failDownload("获取流失败" + Util.getPrintException(e));
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
e1.printStackTrace();
|
e1.printStackTrace();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.arialyy.downloadutil.util;
|
package com.arialyy.downloadutil.util;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
Reference in New Issue
Block a user