From c1de3b84196dcccf9b9c57eb62de105d8e07513a Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Tue, 6 Dec 2016 18:16:31 +0800 Subject: [PATCH] fix bug --- .../arialyy/simple/activity/MainActivity.java | 33 ++++++++-------- .../simple/activity/MultiTaskActivity.java | 7 ---- .../simple/activity/SingleTaskActivity.java | 38 ++++++------------- .../simple/adapter/DownloadAdapter.java | 28 +++++++------- .../arialyy/simple/module/DownloadModule.java | 38 ++++++++++++------- app/src/main/res/layout/activity_main.xml | 1 + .../com/arialyy/downloadutil/core/Aria.java | 2 - .../downloadutil/core/DownloadEntity.java | 2 +- .../core/queue/DownloadTaskQueue.java | 1 + .../core/scheduler/DownloadSchedulers.java | 5 +++ .../core/scheduler/IDownloadSchedulers.java | 1 - .../arialyy/downloadutil/core/task/Task.java | 22 ++++++----- 12 files changed, 88 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/com/arialyy/simple/activity/MainActivity.java b/app/src/main/java/com/arialyy/simple/activity/MainActivity.java index 6c22b7f4..f73c6eed 100644 --- a/app/src/main/java/com/arialyy/simple/activity/MainActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/MainActivity.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package com.arialyy.simple.activity; import android.Manifest; @@ -48,22 +47,26 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> { super.init(savedInstanceState); setSupportActionBar(mBar); mBar.setTitle("多线程多任务下载"); - boolean hasPermission = PermissionManager.getInstance() - .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); - if (hasPermission || Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { setEnable(true); - } else { - setEnable(false); - PermissionManager.getInstance().requestPermission(this, new OnPermissionCallback() { - @Override public void onSuccess(String... permissions) { - setEnable(true); - } + } else { //6.0处理 + boolean hasPermission = PermissionManager.getInstance() + .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (hasPermission) { + setEnable(true); + } else { + setEnable(false); + PermissionManager.getInstance().requestPermission(this, new OnPermissionCallback() { + @Override public void onSuccess(String... permissions) { + setEnable(true); + } - @Override public void onFail(String... permissions) { - T.showShort(MainActivity.this, "没有文件读写权限"); - setEnable(false); - } - }, Manifest.permission.WRITE_EXTERNAL_STORAGE); + @Override public void onFail(String... permissions) { + T.showShort(MainActivity.this, "没有文件读写权限"); + setEnable(false); + } + }, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } } } diff --git a/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java index 8ce713eb..4fb51665 100644 --- a/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java @@ -17,20 +17,14 @@ package com.arialyy.simple.activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; -import android.widget.Button; import butterknife.Bind; import com.arialyy.downloadutil.core.AMTarget; import com.arialyy.downloadutil.core.Aria; -import com.arialyy.downloadutil.core.DownloadEntity; -import com.arialyy.downloadutil.core.DownloadManager; import com.arialyy.downloadutil.core.task.Task; import com.arialyy.frame.util.show.L; import com.arialyy.simple.R; @@ -116,7 +110,6 @@ public class MultiTaskActivity extends BaseActivity<ActivityMultiBinding> { @Override protected void onResume() { super.onResume(); - //registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); Aria.whit(this).addSchedulerListener(new MySchedulerListener()); } diff --git a/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java index 515e26d5..c8e52ede 100644 --- a/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java @@ -28,7 +28,6 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import butterknife.Bind; -import com.arialyy.downloadutil.core.AMReceiver; import com.arialyy.downloadutil.core.AMTarget; import com.arialyy.downloadutil.core.Aria; import com.arialyy.downloadutil.core.DownloadEntity; @@ -47,11 +46,13 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { public static final int DOWNLOAD_RESUME = 0x05; public static final int DOWNLOAD_COMPLETE = 0x06; public static final int DOWNLOAD_RUNNING = 0x07; - private ProgressBar mPb; - private String mDownloadUrl = - "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk"; - private Button mStart, mStop, mCancel; - private TextView mSize; + private static final String DOWNLOAD_URL = + "http://static.gaoshouyou.com/d/3a/93/573ae1db9493a801c24bf66128b11e39.apk"; + @Bind(R.id.progressBar) ProgressBar mPb; + @Bind(R.id.start) Button mStart; + @Bind(R.id.stop) Button mStop; + @Bind(R.id.cancel) Button mCancel; + @Bind(R.id.size) TextView mSize; @Bind(R.id.toolbar) Toolbar toolbar; private DownloadEntity mEntity; private BroadcastReceiver mReceiver; @@ -115,15 +116,11 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { @Override protected void onResume() { super.onResume(); - //IntentFilter filter = getModule(DownloadModule.class).getDownloadFilter(); - //mReceiver = getModule(DownloadModule.class).createReceiver(mUpdateHandler); - //registerReceiver(mReceiver, filter); Aria.whit(this).addSchedulerListener(new MySchedulerListener()); } @Override protected void onDestroy() { super.onDestroy(); - //unregisterReceiver(mReceiver); } @Override protected int setLayoutId() { @@ -138,15 +135,8 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { } 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); - //mFactory = CmdFactory.getInstance(); - //mManager = DownloadManager.getInstance(); mEntity = DbEntity.findData(DownloadEntity.class, new String[] { "downloadUrl" }, - new String[] { mDownloadUrl }); + new String[] { DOWNLOAD_URL }); if (mEntity != null) { mPb.setProgress((int) ((mEntity.getCurrentProgress() * 100) / mEntity.getFileSize())); mSize.setText(CommonUtil.formatFileSize(mEntity.getFileSize())); @@ -159,7 +149,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { } else { mEntity = new DownloadEntity(); mEntity.setFileName("test.apk"); - mEntity.setDownloadUrl(mDownloadUrl); + mEntity.setDownloadUrl(DOWNLOAD_URL); mEntity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); } } @@ -170,7 +160,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { String text = ((TextView) view).getText().toString(); if (text.equals("重新开始?") || text.equals("开始")) { start(); - }else if (text.equals("恢复")){ + } else if (text.equals("恢复")) { resume(); } break; @@ -183,14 +173,11 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { } } - private void resume(){ + private void resume() { Aria.whit(this).load(mEntity).resume(); } private void start() { - mEntity.setFileName("test.apk"); - mEntity.setDownloadUrl(mDownloadUrl); - mEntity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); Aria.whit(this).load(mEntity).start(); } @@ -202,7 +189,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { Aria.whit(this).load(mEntity).cancel(); } - private class MySchedulerListener extends AMTarget.SimpleSchedulerListener{ + private class MySchedulerListener extends AMTarget.SimpleSchedulerListener { @Override public void onTaskStart(Task task) { mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getDownloadEntity().getFileSize()) .sendToTarget(); @@ -240,5 +227,4 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> { } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java index 15f26222..93aa7216 100644 --- a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java +++ b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java @@ -38,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Created by Lyy on 2016/9/27. @@ -47,7 +48,7 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte private static final String TAG = "DownloadAdapter"; private DownloadManager mManager; private CmdFactory mFactory; - private Map<String, Integer> mPositions = new HashMap<>(); + private Map<String, Integer> mPositions = new ConcurrentHashMap<>(); public DownloadAdapter(Context context, List<DownloadEntity> data) { super(context, data); @@ -82,6 +83,9 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte notifyDataSetChanged(); } else { int position = indexItem(entity.getDownloadUrl()); + if (position == -1){ + return; + } mData.set(position, entity); notifyItemChanged(position); } @@ -90,16 +94,18 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte public synchronized void setProgress(DownloadEntity entity) { String url = entity.getDownloadUrl(); int position = indexItem(url); + if (position == -1){ + return; + } mData.set(position, entity); notifyItemChanged(position); } private synchronized int indexItem(String url) { - Set set = mPositions.entrySet(); - for (Object aSet : set) { - Map.Entry entry = (Map.Entry) aSet; - if (entry.getKey().equals(url)) { - return (int) entry.getValue(); + Set<String> keys = mPositions.keySet(); + for (String key : keys){ + if (key.equals(url)){ + return mPositions.get(key); } } return -1; @@ -112,7 +118,7 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte long speed = item.getSpeed(); current = size == 0 ? 0 : (int) (progress * 100 / size); holder.progress.setProgress(current); - BtClickListener listener = new BtClickListener(position, item); + BtClickListener listener = new BtClickListener(item); holder.bt.setOnClickListener(listener); String str = ""; int color = android.R.color.holo_green_light; @@ -166,11 +172,9 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte private class BtClickListener implements View.OnClickListener { private DownloadEntity entity; - private int position; - BtClickListener(int position, DownloadEntity entity) { + BtClickListener(DownloadEntity entity) { this.entity = entity; - this.position = position; } @Override public void onClick(View v) { @@ -189,14 +193,10 @@ public class DownloadAdapter extends AbsRVAdapter<DownloadEntity, DownloadAdapte } private void start(DownloadEntity entity) { - //IDownloadCmd startCmd = mFactory.createCmd(entity, CmdFactory.TASK_START); - //mManager.setCmd(startCmd).exe(); Aria.whit(getContext()).load(entity).start(); } private void stop(DownloadEntity entity) { - //IDownloadCmd stopCmd = mFactory.createCmd(entity, CmdFactory.TASK_STOP); - //mManager.setCmd(stopCmd).exe(); Aria.whit(getContext()).load(entity).stop(); } } diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java index 2165880c..559dac04 100644 --- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java +++ b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package com.arialyy.simple.module; import android.content.BroadcastReceiver; @@ -48,9 +47,16 @@ public class DownloadModule extends BaseModule { * 设置下载数据 */ public List<DownloadEntity> getDownloadData() { - List<DownloadEntity> list = DownloadEntity.findAllData(DownloadEntity.class); - if (list == null || list.size() == 0) { - list = createNewDownload(); + String[] urls = getContext().getResources().getStringArray(R.array.test_apk_download_url); + List<DownloadEntity> list = new ArrayList<>(); + for (String url : urls) { + DownloadEntity entity = + DownloadEntity.findData(DownloadEntity.class, new String[] { "downloadUrl" }, + new String[] { url }); + if (entity == null) { + entity = createDownloadEntity(url); + } + list.add(entity); } return list; } @@ -80,6 +86,17 @@ public class DownloadModule extends BaseModule { return list; } + private DownloadEntity createDownloadEntity(String url) { + String fileName = CommonUtil.keyToHashCode(url) + ".apk"; + DownloadEntity entity = new DownloadEntity(); + entity.setDownloadUrl(url); + entity.setDownloadPath(getDownloadPath(url)); + entity.setFileName(fileName); + //entity.setFileName("taskName_________" + i); + entity.save(); + return entity; + } + /** * 创建下载列表 */ @@ -88,14 +105,7 @@ public class DownloadModule extends BaseModule { String[] urls = getContext().getResources().getStringArray(R.array.test_apk_download_url); int i = 0; for (String url : urls) { - String fileName = CommonUtil.keyToHashCode(url) + ".apk"; - DownloadEntity entity = new DownloadEntity(); - entity.setDownloadUrl(url); - entity.setDownloadPath(getDownloadPath(url)); - //entity.setFileName(fileName); - entity.setFileName("taskName_________" + i); - entity.save(); - list.add(entity); + list.add(createDownloadEntity(url)); i++; } return list; @@ -122,7 +132,7 @@ public class DownloadModule extends BaseModule { /** * 创建Receiver */ - public BroadcastReceiver createReceiver(final Handler handler){ + public BroadcastReceiver createReceiver(final Handler handler) { return new BroadcastReceiver() { long len = 0; @@ -146,7 +156,7 @@ public class DownloadModule extends BaseModule { break; case DownloadManager.ACTION_RUNNING: long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); - int progress = len ==0 ? 0 : (int) ((current * 100) / len); + int progress = len == 0 ? 0 : (int) ((current * 100) / len); handler.obtainMessage(SingleTaskActivity.DOWNLOAD_RUNNING, progress).sendToTarget(); break; case DownloadManager.ACTION_STOP: diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fb7c67ea..d3137e4e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,7 @@ > <LinearLayout + android:fitsSystemWindows="true" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java index 09064169..b77e228f 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java @@ -22,9 +22,7 @@ import android.app.Application; import android.app.Fragment; import android.app.Service; import android.content.Context; -import android.content.ContextWrapper; import android.os.Build; -import com.bumptech.glide.Glide; /** * Created by lyy on 2016/12/1. diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadEntity.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadEntity.java index 6e53bc7f..8874136d 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadEntity.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadEntity.java @@ -75,6 +75,7 @@ public class DownloadEntity extends DbEntity implements Parcelable { } }; @Ignore private long speed = 0; //下载速度 + @Ignore private int failNum = 0; private String downloadUrl = ""; //下载路径 private String downloadPath = ""; //保存路径 private String fileName = ""; //文件名 @@ -83,7 +84,6 @@ public class DownloadEntity extends DbEntity implements Parcelable { private int state = STATE_WAIT; private boolean isDownloadComplete = false; //是否下载完成 private long currentProgress = 0; //当前下载进度 - private int failNum = 0; private long completeTime; //完成时间 public DownloadEntity() { diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/queue/DownloadTaskQueue.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/queue/DownloadTaskQueue.java index 4e25cfb9..95274314 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/queue/DownloadTaskQueue.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/queue/DownloadTaskQueue.java @@ -82,6 +82,7 @@ public class DownloadTaskQueue implements ITaskQueue { @Override public void startTask(Task task) { if (mExecutePool.putTask(task)) { mCachePool.removeTask(task); + task.getDownloadEntity().setFailNum(0); task.start(); } } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java index 793b7345..946df3eb 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java @@ -186,6 +186,11 @@ public class DownloadSchedulers implements IDownloadSchedulers { if (entity.getFailNum() <= mFailNum) { Task task = mQueue.getTask(entity); mQueue.reTryStart(task); + try { + Thread.currentThread().sleep(4000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } else { startNextTask(entity); } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/IDownloadSchedulers.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/IDownloadSchedulers.java index f7df479c..a481ca95 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/IDownloadSchedulers.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/IDownloadSchedulers.java @@ -16,7 +16,6 @@ package com.arialyy.downloadutil.core.scheduler; -import android.content.Context; import android.os.Handler; import com.arialyy.downloadutil.core.DownloadEntity; diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java index fe0ae0a5..cb6497f1 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java @@ -218,7 +218,7 @@ public class Task { @Override public void onPre() { super.onPre(); downloadEntity.setState(DownloadEntity.STATE_PRE); - //sendIntent(DownloadManager.ACTION_PRE, -1); + sendIntent(DownloadManager.ACTION_PRE, -1); } @Override public void onPostPre(long fileSize) { @@ -226,21 +226,22 @@ public class Task { downloadEntity.setFileSize(fileSize); downloadEntity.setState(DownloadEntity.STATE_POST_PRE); sendInState2Target(DownloadSchedulers.PRE); - //sendIntent(DownloadManager.ACTION_POST_PRE, -1); + sendIntent(DownloadManager.ACTION_POST_PRE, -1); } @Override public void onResume(long resumeLocation) { super.onResume(resumeLocation); downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING); sendInState2Target(DownloadSchedulers.RESUME); - //sendIntent(DownloadManager.ACTION_RESUME, resumeLocation); + sendIntent(DownloadManager.ACTION_RESUME, resumeLocation); } @Override public void onStart(long startLocation) { super.onStart(startLocation); downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING); + downloadEntity.setFailNum(0); sendInState2Target(DownloadSchedulers.START); - //sendIntent(DownloadManager.ACTION_START, startLocation); + sendIntent(DownloadManager.ACTION_START, startLocation); } @Override public void onProgress(long currentLocation) { @@ -259,7 +260,7 @@ public class Task { downloadEntity.setCurrentProgress(currentLocation); lastLen = currentLocation; sendInState2Target(DownloadSchedulers.RUNNING); - //context.sendBroadcast(sendIntent); + context.sendBroadcast(sendIntent); } } @@ -268,14 +269,14 @@ public class Task { downloadEntity.setState(DownloadEntity.STATE_STOP); downloadEntity.setSpeed(0); sendInState2Target(DownloadSchedulers.STOP); - //sendIntent(DownloadManager.ACTION_STOP, stopLocation); + sendIntent(DownloadManager.ACTION_STOP, stopLocation); } @Override public void onCancel() { super.onCancel(); downloadEntity.setState(DownloadEntity.STATE_CANCEL); sendInState2Target(DownloadSchedulers.CANCEL); - //sendIntent(DownloadManager.ACTION_CANCEL, -1); + sendIntent(DownloadManager.ACTION_CANCEL, -1); downloadEntity.deleteData(); } @@ -285,15 +286,16 @@ public class Task { downloadEntity.setDownloadComplete(true); downloadEntity.setSpeed(0); sendInState2Target(DownloadSchedulers.COMPLETE); - //sendIntent(DownloadManager.ACTION_COMPLETE, downloadEntity.getFileSize()); + sendIntent(DownloadManager.ACTION_COMPLETE, downloadEntity.getFileSize()); } @Override public void onFail() { super.onFail(); + downloadEntity.setFailNum(downloadEntity.getFailNum() + 1); downloadEntity.setState(DownloadEntity.STATE_FAIL); downloadEntity.setSpeed(0); sendInState2Target(DownloadSchedulers.FAIL); - //sendIntent(DownloadManager.ACTION_FAIL, -1); + sendIntent(DownloadManager.ACTION_FAIL, -1); } private void sendIntent(String action, long location) { @@ -305,7 +307,7 @@ public class Task { if (location != -1) { intent.putExtra(DownloadManager.CURRENT_LOCATION, location); } - context.sendBroadcast(intent); + //context.sendBroadcast(intent); } } } \ No newline at end of file