Skip to content

Commit c116e09

Browse files
committed
修复多线程引起的下载出错显示异常的bug
新增取消任务null Listener判断
1 parent f15ab27 commit c116e09

File tree

4 files changed

+587
-36
lines changed

4 files changed

+587
-36
lines changed

library/src/main/java/jaygoo/library/m3u8downloader/DownloadQueue.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,14 @@ public void offer(M3U8Task task){
3434
* @return
3535
*/
3636
public M3U8Task poll(){
37-
if (queue.size() >= 2){
38-
queue.remove(0);
39-
return queue.get(0);
40-
}else if (queue.size() == 1){
41-
queue.remove(0);
37+
try {
38+
if (queue.size() >= 2){
39+
queue.remove(0);
40+
return queue.get(0);
41+
}else if (queue.size() == 1){
42+
queue.remove(0);
43+
}
44+
}catch (Exception e){
4245
}
4346
return null;
4447
}
@@ -48,8 +51,11 @@ public M3U8Task poll(){
4851
* @return
4952
*/
5053
public M3U8Task peek(){
51-
if (queue.size() >= 1){
52-
return queue.get(0);
54+
try {
55+
if (queue.size() >= 1){
56+
return queue.get(0);
57+
}
58+
}catch (Exception e){
5359
}
5460
return null;
5561
}
@@ -81,16 +87,24 @@ public boolean contains(M3U8Task task){
8187
* @return
8288
*/
8389
public M3U8Task getTask(String url){
84-
for (int i = 0; i < queue.size(); i++){
85-
if (queue.get(i).getUrl().equals(url)){
86-
return queue.get(i);
90+
try {
91+
for (int i = 0; i < queue.size(); i++){
92+
if (queue.get(i).getUrl().equals(url)){
93+
return queue.get(i);
94+
}
8795
}
96+
}catch (Exception e){
8897
}
98+
8999
return null;
90100
}
91101

92102
public boolean isEmpty(){
93-
return queue.size() == 0;
103+
return size() == 0;
104+
}
105+
106+
public int size(){
107+
return queue.size();
94108
}
95109

96110
public boolean isHead(String url){

library/src/main/java/jaygoo/library/m3u8downloader/M3U8DownloadTask.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package jaygoo.library.m3u8downloader;
22

3+
import android.os.Handler;
4+
import android.os.Message;
5+
36
import java.io.File;
47
import java.io.FileOutputStream;
58
import java.io.IOException;
@@ -26,6 +29,10 @@
2629
* ================================================
2730
*/
2831
class M3U8DownloadTask {
32+
private static final int WHAT_ON_ERROR = 1001;
33+
private static final int WHAT_ON_PROGRESS = 1002;
34+
private static final int WHAT_ON_SUCCESS = 1003;
35+
private static final int WHAT_ON_START_DOWNLOAD = 1004;
2936
private OnTaskDownloadListener onTaskDownloadListener;
3037
//加密Key,默认为空,不加密
3138
private String encryptKey = null;
@@ -68,6 +75,33 @@ class M3U8DownloadTask {
6875
private ExecutorService executor;//线程池
6976
private M3U8 currentM3U8;
7077

78+
private WeakHandler mHandler = new WeakHandler(new Handler.Callback() {
79+
@Override
80+
public boolean handleMessage(Message msg) {
81+
switch (msg.what) {
82+
case WHAT_ON_ERROR:
83+
onTaskDownloadListener.onError((Throwable) msg.obj);
84+
break;
85+
86+
case WHAT_ON_START_DOWNLOAD:
87+
onTaskDownloadListener.onStartDownload(totalTs, curTs);
88+
break;
89+
90+
case WHAT_ON_PROGRESS:
91+
onTaskDownloadListener.onDownloading(totalFileSize, itemFileSize, totalTs, curTs);
92+
break;
93+
94+
case WHAT_ON_SUCCESS:
95+
if (netSpeedTimer != null) {
96+
netSpeedTimer.cancel();
97+
}
98+
onTaskDownloadListener.onSuccess(currentM3U8);
99+
break;
100+
}
101+
return true;
102+
}
103+
});
104+
71105
public M3U8DownloadTask(){
72106
connTimeout = M3U8DownloaderConfig.getConnTimeout();
73107
readTimeout = M3U8DownloaderConfig.getReadTimeout();
@@ -138,10 +172,7 @@ public void run() {
138172
currentM3U8.setM3u8FilePath(m3u8File.getPath());
139173
currentM3U8.setDirFilePath(saveDir);
140174
currentM3U8.getFileSize();
141-
if (netSpeedTimer != null) {
142-
netSpeedTimer.cancel();
143-
}
144-
onTaskDownloadListener.onSuccess(currentM3U8);
175+
mHandler.sendEmptyMessage(WHAT_ON_SUCCESS);
145176
isRunning = false;
146177
}
147178
} catch (InterruptedIOException e) {
@@ -240,7 +271,7 @@ public void run() {
240271
if (conn.getResponseCode() == 200) {
241272
if (isStartDownload){
242273
isStartDownload = false;
243-
onTaskDownloadListener.onStartDownload(totalTs, curTs);
274+
mHandler.sendEmptyMessage(WHAT_ON_START_DOWNLOAD);
244275
}
245276
inputStream = conn.getInputStream();
246277
fos = new FileOutputStream(file);//会自动创建文件
@@ -278,7 +309,7 @@ public void run() {
278309

279310
itemFileSize = file.length();
280311
m3U8Ts.setFileSize(itemFileSize);
281-
onTaskDownloadListener.onDownloading(totalFileSize, itemFileSize, totalTs, curTs);
312+
mHandler.sendEmptyMessage(WHAT_ON_PROGRESS);
282313
curTs++;
283314
}else {
284315
curTs ++;
@@ -304,7 +335,10 @@ private void handlerError(Throwable e) {
304335
if ("thread interrupted".equals(e.getMessage())) {
305336
return;
306337
}
307-
onTaskDownloadListener.onError(e);
338+
Message msg = Message.obtain();
339+
msg.obj = e;
340+
msg.what = WHAT_ON_ERROR;
341+
mHandler.sendMessage(msg);
308342
}
309343

310344
/**

library/src/main/java/jaygoo/library/m3u8downloader/M3U8Downloader.java

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package jaygoo.library.m3u8downloader;
22

3+
import android.support.annotation.Nullable;
34
import android.text.TextUtils;
5+
import android.util.Log;
46

57
import java.io.File;
68
import java.util.List;
@@ -204,6 +206,7 @@ private void startDownloadTask(M3U8Task task){
204206
M3U8Log.d("start download task, but task is running: " + task.getUrl());
205207
return;
206208
}
209+
207210
if (task.getState() == M3U8TaskState.PAUSE){
208211
M3U8Log.d("start download task, but task has pause: " + task.getUrl());
209212
return;
@@ -237,17 +240,21 @@ public void cancel(List<String> urls){
237240
* 取消任务,删除缓存
238241
* @param url
239242
*/
240-
public void cancelAndDelete(final String url, final OnDeleteTaskListener listener){
243+
public void cancelAndDelete(final String url, @Nullable final OnDeleteTaskListener listener){
241244
pause(url);
242-
listener.onStart();
245+
if (listener != null) {
246+
listener.onStart();
247+
}
243248
new Thread(new Runnable() {
244249
@Override
245250
public void run() {
246251
boolean isDelete = MUtils.clearDir(new File(MUtils.getSaveFileDir(url)));
247-
if (isDelete){
248-
listener.onSuccess();
249-
}else {
250-
listener.onFail();
252+
if (listener != null) {
253+
if (isDelete) {
254+
listener.onSuccess();
255+
} else {
256+
listener.onFail();
257+
}
251258
}
252259
}
253260
}).start();
@@ -258,20 +265,24 @@ public void run() {
258265
* @param urls
259266
* @param listener
260267
*/
261-
public void cancelAndDelete(final List<String> urls, final OnDeleteTaskListener listener){
268+
public void cancelAndDelete(final List<String> urls, @Nullable final OnDeleteTaskListener listener){
262269
pause(urls);
263-
listener.onStart();
270+
if (listener != null) {
271+
listener.onStart();
272+
}
264273
new Thread(new Runnable() {
265274
@Override
266275
public void run() {
267276
boolean isDelete = true;
268277
for (String url : urls){
269278
isDelete = isDelete && MUtils.clearDir(new File(MUtils.getSaveFileDir(url)));
270279
}
271-
if (isDelete){
272-
listener.onSuccess();
273-
}else {
274-
listener.onFail();
280+
if (listener != null) {
281+
if (isDelete) {
282+
listener.onSuccess();
283+
} else {
284+
listener.onFail();
285+
}
275286
}
276287
}
277288
}).start();
@@ -337,12 +348,12 @@ public void onStart() {
337348

338349
@Override
339350
public void onError(Throwable errorMsg) {
340-
currentM3U8Task.setState(M3U8TaskState.ERROR);
341-
if (onM3U8DownloadListener != null){
342-
onM3U8DownloadListener.onDownloadError(currentM3U8Task, errorMsg);
343-
}
344-
M3U8Log.e("onError: "+ errorMsg.getMessage());
345-
downloadNextTask();
351+
currentM3U8Task.setState(M3U8TaskState.ERROR);
352+
if (onM3U8DownloadListener != null) {
353+
onM3U8DownloadListener.onDownloadError(currentM3U8Task, errorMsg);
354+
}
355+
M3U8Log.e("onError: " + errorMsg.getMessage());
356+
downloadNextTask();
346357
}
347358

348359
};

0 commit comments

Comments
 (0)