chunked
This commit is contained in:
@@ -129,7 +129,11 @@ public abstract class AbsFileer<ENTITY extends AbsNormalEntity, TASK_ENTITY exte
|
|||||||
final int num =
|
final int num =
|
||||||
mEntity.getFileSize() <= SUB_LEN || mTaskEntity.requestType == AbsTaskEntity.D_FTP_DIR ? 1
|
mEntity.getFileSize() <= SUB_LEN || mTaskEntity.requestType == AbsTaskEntity.D_FTP_DIR ? 1
|
||||||
: AriaManager.getInstance(mContext).getDownloadConfig().getThreadNum();
|
: AriaManager.getInstance(mContext).getDownloadConfig().getThreadNum();
|
||||||
mStartThreadNum = num;
|
if (mTaskEntity instanceof DownloadTaskEntity && ((DownloadTaskEntity) mTaskEntity).isChunked) {
|
||||||
|
mStartThreadNum = 1;
|
||||||
|
} else {
|
||||||
|
mStartThreadNum = num;
|
||||||
|
}
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.arialyy.aria.core.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by AriaL on 2018/3/3.
|
||||||
|
* 获取文件信息完成后 回调给下载线程的信息
|
||||||
|
*/
|
||||||
|
public class CompleteInfo {
|
||||||
|
/**
|
||||||
|
* 自定义的状态码
|
||||||
|
*/
|
||||||
|
public int code;
|
||||||
|
|
||||||
|
public CompleteInfo(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,12 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
package com.arialyy.aria.core.common;
|
package com.arialyy.aria.core.common;
|
||||||
|
|
||||||
public interface OnFileInfoCallback {
|
public interface OnFileInfoCallback {
|
||||||
/**
|
/**
|
||||||
* 处理完成
|
* 处理完成
|
||||||
*
|
*
|
||||||
* @param code 状态码
|
* @param info 一些回调的信息
|
||||||
*/
|
*/
|
||||||
void onComplete(String url, int code);
|
void onComplete(String url, CompleteInfo info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求失败
|
* 请求失败
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
package com.arialyy.aria.core.download;
|
package com.arialyy.aria.core.download;
|
||||||
|
|
||||||
import com.arialyy.aria.core.inf.AbsNormalTaskEntity;
|
import com.arialyy.aria.core.inf.AbsNormalTaskEntity;
|
||||||
|
import com.arialyy.aria.orm.Ignore;
|
||||||
import com.arialyy.aria.orm.NoNull;
|
import com.arialyy.aria.orm.NoNull;
|
||||||
import com.arialyy.aria.orm.OneToOne;
|
import com.arialyy.aria.orm.OneToOne;
|
||||||
|
|
||||||
@@ -37,6 +38,11 @@ public class DownloadTaskEntity extends AbsNormalTaskEntity<DownloadEntity> {
|
|||||||
*/
|
*/
|
||||||
public String groupName = "";
|
public String groupName = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否是chunk模式
|
||||||
|
*/
|
||||||
|
public boolean isChunked = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该任务是否属于任务组
|
* 该任务是否属于任务组
|
||||||
*/
|
*/
|
||||||
|
@@ -86,6 +86,7 @@ class ConnectionHelp {
|
|||||||
.append("image/jpeg, ")
|
.append("image/jpeg, ")
|
||||||
.append("image/pjpeg, ")
|
.append("image/pjpeg, ")
|
||||||
.append("image/webp, ")
|
.append("image/webp, ")
|
||||||
|
.append("image/apng, ")
|
||||||
.append("application/xml, ")
|
.append("application/xml, ")
|
||||||
.append("application/xaml+xml, ")
|
.append("application/xaml+xml, ")
|
||||||
.append("application/xhtml+xml, ")
|
.append("application/xhtml+xml, ")
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
package com.arialyy.aria.core.download.downloader;
|
package com.arialyy.aria.core.download.downloader;
|
||||||
|
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.IUtil;
|
import com.arialyy.aria.core.common.IUtil;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||||
@@ -99,7 +100,7 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil {
|
|||||||
callback = new OnFileInfoCallback() {
|
callback = new OnFileInfoCallback() {
|
||||||
int failNum = 0;
|
int failNum = 0;
|
||||||
|
|
||||||
@Override public void onComplete(String url, int code) {
|
@Override public void onComplete(String url, CompleteInfo info) {
|
||||||
DownloadTaskEntity te = mExeMap.get(url);
|
DownloadTaskEntity te = mExeMap.get(url);
|
||||||
if (te != null) {
|
if (te != null) {
|
||||||
if (isNeedLoadFileSize) {
|
if (isNeedLoadFileSize) {
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.download.downloader;
|
package com.arialyy.aria.core.download.downloader;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||||
@@ -41,8 +42,8 @@ public class FtpDirDownloadUtil extends AbsGroupUtil {
|
|||||||
startDownload();
|
startDownload();
|
||||||
} else {
|
} else {
|
||||||
new FtpDirInfoThread(mGTEntity, new OnFileInfoCallback() {
|
new FtpDirInfoThread(mGTEntity, new OnFileInfoCallback() {
|
||||||
@Override public void onComplete(String url, int code) {
|
@Override public void onComplete(String url, CompleteInfo info) {
|
||||||
if (code >= 200 && code < 300) {
|
if (info.code >= 200 && info.code < 300) {
|
||||||
for (DownloadEntity entity : mGTEntity.entity.getSubTask()) {
|
for (DownloadEntity entity : mGTEntity.entity.getSubTask()) {
|
||||||
mExeMap.put(entity.getUrl(), createChildDownloadTask(entity));
|
mExeMap.put(entity.getUrl(), createChildDownloadTask(entity));
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.downloader;
|
|||||||
|
|
||||||
import com.arialyy.aria.core.FtpUrlEntity;
|
import com.arialyy.aria.core.FtpUrlEntity;
|
||||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
import com.arialyy.aria.core.download.DownloadGroupEntity;
|
||||||
@@ -48,7 +49,7 @@ class FtpDirInfoThread extends AbsFtpInfoThread<DownloadGroupEntity, DownloadGro
|
|||||||
@Override protected void onPreComplete(int code) {
|
@Override protected void onPreComplete(int code) {
|
||||||
super.onPreComplete(code);
|
super.onPreComplete(code);
|
||||||
mEntity.setFileSize(mSize);
|
mEntity.setFileSize(mSize);
|
||||||
mCallback.onComplete(mEntity.getKey(), code);
|
mCallback.onComplete(mEntity.getKey(), new CompleteInfo(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEntity(String remotePath, FTPFile ftpFile) {
|
private void addEntity(String remotePath, FTPFile ftpFile) {
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
package com.arialyy.aria.core.download.downloader;
|
package com.arialyy.aria.core.download.downloader;
|
||||||
|
|
||||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||||
@@ -40,6 +41,6 @@ class FtpFileInfoThread extends AbsFtpInfoThread<DownloadEntity, DownloadTaskEnt
|
|||||||
mTaskEntity.isNewTask = true;
|
mTaskEntity.isNewTask = true;
|
||||||
}
|
}
|
||||||
mEntity.setFileSize(mSize);
|
mEntity.setFileSize(mSize);
|
||||||
mCallback.onComplete(mEntity.getUrl(), code);
|
mCallback.onComplete(mEntity.getUrl(), new CompleteInfo(code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.downloader;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import com.arialyy.aria.core.AriaManager;
|
import com.arialyy.aria.core.AriaManager;
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||||
@@ -24,9 +25,12 @@ import com.arialyy.aria.util.ALog;
|
|||||||
import com.arialyy.aria.util.CheckUtil;
|
import com.arialyy.aria.util.CheckUtil;
|
||||||
import com.arialyy.aria.util.CommonUtil;
|
import com.arialyy.aria.util.CommonUtil;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 下载文件信息获取
|
* 下载文件信息获取
|
||||||
@@ -55,6 +59,9 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
conn.setRequestProperty("Range", "bytes=" + 0 + "-");
|
||||||
conn.setConnectTimeout(mConnectTimeOut);
|
conn.setConnectTimeout(mConnectTimeOut);
|
||||||
conn.setRequestMethod(mTaskEntity.requestEnum.name);
|
conn.setRequestMethod(mTaskEntity.requestEnum.name);
|
||||||
|
conn.setDoOutput(true);
|
||||||
|
conn.setDoInput(true);
|
||||||
|
conn.setChunkedStreamingMode(0);
|
||||||
conn.connect();
|
conn.connect();
|
||||||
handleConnect(conn);
|
handleConnect(conn);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -84,7 +91,19 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
mEntity.setMd5Code(md5Code);
|
mEntity.setMd5Code(md5Code);
|
||||||
}
|
}
|
||||||
String disposition = conn.getHeaderField(mTaskEntity.dispositionKey);
|
String disposition = conn.getHeaderField(mTaskEntity.dispositionKey);
|
||||||
//Map<String, List<String>> headers = conn.getHeaderFields();
|
Map<String, List<String>> headers = conn.getHeaderFields();
|
||||||
|
boolean isChunked = false;
|
||||||
|
//https://my.oschina.net/ososchina/blog/666761
|
||||||
|
if (conn.getHeaderField("Transfer-Encoding").equals("chunked")) {
|
||||||
|
isChunked = true;
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
InputStream is = conn.getInputStream();
|
||||||
|
int l = 0;
|
||||||
|
//while (true){
|
||||||
|
// is.read()
|
||||||
|
//}
|
||||||
|
}
|
||||||
if (!TextUtils.isEmpty(disposition)) {
|
if (!TextUtils.isEmpty(disposition)) {
|
||||||
mEntity.setDisposition(CommonUtil.encryptBASE64(disposition));
|
mEntity.setDisposition(CommonUtil.encryptBASE64(disposition));
|
||||||
if (disposition.contains(mTaskEntity.dispositionFileKey)) {
|
if (disposition.contains(mTaskEntity.dispositionFileKey)) {
|
||||||
@@ -95,12 +114,16 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
|
|
||||||
mTaskEntity.code = code;
|
mTaskEntity.code = code;
|
||||||
if (code == HttpURLConnection.HTTP_PARTIAL) {
|
if (code == HttpURLConnection.HTTP_PARTIAL) {
|
||||||
if (!checkLen(len)) return;
|
if (!checkLen(len) && !isChunked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
mEntity.setFileSize(len);
|
mEntity.setFileSize(len);
|
||||||
mTaskEntity.isSupportBP = true;
|
mTaskEntity.isSupportBP = true;
|
||||||
isComplete = true;
|
isComplete = true;
|
||||||
} else if (code == HttpURLConnection.HTTP_OK) {
|
} else if (code == HttpURLConnection.HTTP_OK) {
|
||||||
if (!checkLen(len)) return;
|
if (!checkLen(len) && !isChunked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
mEntity.setFileSize(len);
|
mEntity.setFileSize(len);
|
||||||
mTaskEntity.isSupportBP = false;
|
mTaskEntity.isSupportBP = false;
|
||||||
isComplete = true;
|
isComplete = true;
|
||||||
@@ -117,10 +140,12 @@ class HttpFileInfoThread implements Runnable {
|
|||||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code, true);
|
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code, true);
|
||||||
}
|
}
|
||||||
if (isComplete) {
|
if (isComplete) {
|
||||||
if (onFileInfoListener != null) {
|
mTaskEntity.isChunked = isChunked;
|
||||||
onFileInfoListener.onComplete(mEntity.getUrl(), code);
|
|
||||||
}
|
|
||||||
mTaskEntity.update();
|
mTaskEntity.update();
|
||||||
|
if (onFileInfoListener != null) {
|
||||||
|
CompleteInfo info = new CompleteInfo(code);
|
||||||
|
onFileInfoListener.onComplete(mEntity.getUrl(), info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,8 @@ import com.arialyy.aria.util.CommonUtil;
|
|||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.RandomAccessFile;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@@ -71,25 +73,21 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
|||||||
conn = ConnectionHelp.setConnectParam(mConfig.TASK_ENTITY, conn);
|
conn = ConnectionHelp.setConnectParam(mConfig.TASK_ENTITY, conn);
|
||||||
conn.setConnectTimeout(STATE.CONNECT_TIME_OUT);
|
conn.setConnectTimeout(STATE.CONNECT_TIME_OUT);
|
||||||
conn.setReadTimeout(STATE.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
conn.setReadTimeout(STATE.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
||||||
|
|
||||||
//is = conn.getInputStream();
|
//is = conn.getInputStream();
|
||||||
is = new BufferedInputStream(conn.getInputStream());
|
is = new BufferedInputStream(conn.getInputStream());
|
||||||
//创建可设置位置的文件
|
//创建可设置位置的文件
|
||||||
file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize);
|
file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize);
|
||||||
//设置每条线程写入文件的位置
|
//设置每条线程写入文件的位置
|
||||||
file.seek(mConfig.START_LOCATION);
|
file.seek(mConfig.START_LOCATION);
|
||||||
byte[] buffer = new byte[mBufSize];
|
|
||||||
int len;
|
if (mTaskEntity.isChunked) {
|
||||||
while ((len = is.read(buffer)) != -1) {
|
readChunk(is, file);
|
||||||
if (STATE.isCancel || STATE.isStop){
|
} else {
|
||||||
break;
|
readNormal(is, file);
|
||||||
}
|
|
||||||
if (mSleepTime > 0) {
|
|
||||||
Thread.sleep(mSleepTime);
|
|
||||||
}
|
|
||||||
file.write(buffer, 0, len);
|
|
||||||
progress(len);
|
|
||||||
}
|
}
|
||||||
if (STATE.isCancel || STATE.isStop){
|
|
||||||
|
if (STATE.isCancel || STATE.isStop) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//支持断点的处理
|
//支持断点的处理
|
||||||
@@ -105,7 +103,7 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
|||||||
STATE.isRunning = false;
|
STATE.isRunning = false;
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
}
|
}
|
||||||
if (STATE.isFail()){
|
if (STATE.isFail()) {
|
||||||
STATE.isRunning = false;
|
STATE.isRunning = false;
|
||||||
mListener.onFail(false);
|
mListener.onFail(false);
|
||||||
}
|
}
|
||||||
@@ -137,6 +135,33 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取chunk模式的文件流
|
||||||
|
*/
|
||||||
|
private void readChunk(InputStream is, RandomAccessFile file)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取普通的文件流
|
||||||
|
*/
|
||||||
|
private void readNormal(InputStream is, RandomAccessFile file)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
byte[] buffer = new byte[mBufSize];
|
||||||
|
int len;
|
||||||
|
while ((len = is.read(buffer)) != -1) {
|
||||||
|
if (STATE.isCancel || STATE.isStop) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mSleepTime > 0) {
|
||||||
|
Thread.sleep(mSleepTime);
|
||||||
|
}
|
||||||
|
file.write(buffer, 0, len);
|
||||||
|
progress(len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected String getTaskType() {
|
@Override protected String getTaskType() {
|
||||||
return "HTTP_DOWNLOAD";
|
return "HTTP_DOWNLOAD";
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.arialyy.aria.core.download.downloader;
|
package com.arialyy.aria.core.download.downloader;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.IUtil;
|
import com.arialyy.aria.core.common.IUtil;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||||
@@ -106,7 +107,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
|
|||||||
switch (mTaskEntity.requestType) {
|
switch (mTaskEntity.requestType) {
|
||||||
case AbsTaskEntity.D_FTP:
|
case AbsTaskEntity.D_FTP:
|
||||||
return new FtpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
return new FtpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
||||||
@Override public void onComplete(String url, int code) {
|
@Override public void onComplete(String url, CompleteInfo info) {
|
||||||
mDownloader.start();
|
mDownloader.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +117,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable {
|
|||||||
});
|
});
|
||||||
case AbsTaskEntity.D_HTTP:
|
case AbsTaskEntity.D_HTTP:
|
||||||
return new HttpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
return new HttpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
||||||
@Override public void onComplete(String url, int code) {
|
@Override public void onComplete(String url, CompleteInfo info) {
|
||||||
mDownloader.start();
|
mDownloader.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
package com.arialyy.aria.core.upload.uploader;
|
package com.arialyy.aria.core.upload.uploader;
|
||||||
|
|
||||||
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
import com.arialyy.aria.core.common.AbsFtpInfoThread;
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||||
@@ -82,6 +83,6 @@ class FtpFileInfoThread extends AbsFtpInfoThread<UploadEntity, UploadTaskEntity>
|
|||||||
|
|
||||||
@Override protected void onPreComplete(int code) {
|
@Override protected void onPreComplete(int code) {
|
||||||
super.onPreComplete(code);
|
super.onPreComplete(code);
|
||||||
mCallback.onComplete(mEntity.getKey(), isComplete ? CODE_COMPLETE : code);
|
mCallback.onComplete(mEntity.getKey(), new CompleteInfo(isComplete ? CODE_COMPLETE : code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.arialyy.aria.core.upload.uploader;
|
package com.arialyy.aria.core.upload.uploader;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.common.CompleteInfo;
|
||||||
import com.arialyy.aria.core.common.IUtil;
|
import com.arialyy.aria.core.common.IUtil;
|
||||||
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
import com.arialyy.aria.core.common.OnFileInfoCallback;
|
||||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||||
@@ -51,8 +52,8 @@ public class SimpleUploadUtil implements IUtil, Runnable {
|
|||||||
switch (mTaskEntity.requestType) {
|
switch (mTaskEntity.requestType) {
|
||||||
case AbsTaskEntity.U_FTP:
|
case AbsTaskEntity.U_FTP:
|
||||||
new FtpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
new FtpFileInfoThread(mTaskEntity, new OnFileInfoCallback() {
|
||||||
@Override public void onComplete(String url, int code) {
|
@Override public void onComplete(String url, CompleteInfo info) {
|
||||||
if (code == FtpFileInfoThread.CODE_COMPLETE) {
|
if (info.code == FtpFileInfoThread.CODE_COMPLETE) {
|
||||||
mListener.onComplete();
|
mListener.onComplete();
|
||||||
} else {
|
} else {
|
||||||
mUploader.start();
|
mUploader.start();
|
||||||
|
@@ -34,7 +34,7 @@ import java.util.Map;
|
|||||||
class DBConfig {
|
class DBConfig {
|
||||||
static Map<String, Class> mapping = new HashMap<>();
|
static Map<String, Class> mapping = new HashMap<>();
|
||||||
static String DB_NAME;
|
static String DB_NAME;
|
||||||
static int VERSION = 23;
|
static int VERSION = 24;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
if (TextUtils.isEmpty(DB_NAME)) {
|
if (TextUtils.isEmpty(DB_NAME)) {
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
## 开发日志
|
## 开发日志
|
||||||
|
+ v_3.3.16
|
||||||
|
- 修复一个activity启动多次,无法进行回掉的bug https://github.com/AriaLyy/Aria/issues/200
|
||||||
+ v_3.3.14
|
+ v_3.3.14
|
||||||
- 修复ftp上传和下载的兼容性问题
|
- 修复ftp上传和下载的兼容性问题
|
||||||
- 如果url中的path有"//"将替换为"/"
|
- 如果url中的path有"//"将替换为"/"
|
||||||
|
@@ -47,7 +47,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
private static final String DOWNLOAD_URL =
|
private static final String DOWNLOAD_URL =
|
||||||
//"http://kotlinlang.org/docs/kotlin-docs.pdf";
|
//"http://kotlinlang.org/docs/kotlin-docs.pdf";
|
||||||
//"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
|
//"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
|
||||||
"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
|
//"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
|
||||||
//"http://sitcac.daxincf.cn/wp-content/uploads/swift_vido/01/element.mp4_1";
|
//"http://sitcac.daxincf.cn/wp-content/uploads/swift_vido/01/element.mp4_1";
|
||||||
//"http://120.25.196.56:8000/filereq?id=15692406294&ipncid=105635&client=android&filename=20170819185541.avi";
|
//"http://120.25.196.56:8000/filereq?id=15692406294&ipncid=105635&client=android&filename=20170819185541.avi";
|
||||||
//"http://down2.xiaoshuofuwuqi.com/d/file/filetxt/20170608/14/%BA%DA%CE%D7%CA%A6%E1%C8%C6%F0.txt";
|
//"http://down2.xiaoshuofuwuqi.com/d/file/filetxt/20170608/14/%BA%DA%CE%D7%CA%A6%E1%C8%C6%F0.txt";
|
||||||
@@ -61,6 +61,8 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
//"http://qudao.5535.cn/one/game.html?game=531&cpsuser=xiaoeryu2";
|
//"http://qudao.5535.cn/one/game.html?game=531&cpsuser=xiaoeryu2";
|
||||||
//"https://bogoe-res.mytbz.com/tbzengsong/If You're Happy.mp3";
|
//"https://bogoe-res.mytbz.com/tbzengsong/If You're Happy.mp3";
|
||||||
//"http://ozr0ucjs5.bkt.clouddn.com/51_box-104_20180131202610.apk";
|
//"http://ozr0ucjs5.bkt.clouddn.com/51_box-104_20180131202610.apk";
|
||||||
|
"http://kf.lyfz.net/api/v1/we_chat/Business/getMaterial?company_id=51454009d703c86c91353f61011ecf2f&appid=wx88c6052d06eaaf7d&media_id=qpkQb72KqNkZhBNIUw7asF0LuJouXCTBd3A-rS2bYl7H4kvTZstEXD3F-pDVeqA-&type=3";
|
||||||
|
//"https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864";
|
||||||
@Bind(R.id.start) Button mStart;
|
@Bind(R.id.start) Button mStart;
|
||||||
@Bind(R.id.stop) Button mStop;
|
@Bind(R.id.stop) Button mStop;
|
||||||
@Bind(R.id.cancel) Button mCancel;
|
@Bind(R.id.cancel) Button mCancel;
|
||||||
@@ -222,15 +224,12 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
private void startD() {
|
private void startD() {
|
||||||
//Aria.get(this).setLogLevel(ALog.LOG_CLOSE);
|
//Aria.get(this).setLogLevel(ALog.LOG_CLOSE);
|
||||||
//Aria.download(this).load("aaaa.apk");
|
//Aria.download(this).load("aaaa.apk");
|
||||||
Map<String, String> map = new HashMap<>();
|
|
||||||
map.put("User-Agent",
|
|
||||||
"Mozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 Mobile MQQBrowser/6.2 TBS/043722 Safari/537.36");
|
|
||||||
map.put("Cookie",
|
|
||||||
"BAIDUID=DFC7EF42C60AD1ACF0BA94389AA67F13:FG=1; H_WISE_SIDS=121192_104493_114745_121434_119046_100098_120212_121140_118882_118858_118850_118820_118792_121254_121534_121214_117588_117242_117431_119974_120597_121043_121422_120943_121175_121272_117552_120482_121013_119962_119145_120851_120841_120034_121325_116407_121109_120654_110085_120708; PSINO=7; BDORZ=AE84CDB3A529C0F8A2B9DCDD1D18B695");
|
|
||||||
Aria.download(SingleTaskActivity.this)
|
Aria.download(SingleTaskActivity.this)
|
||||||
.load(DOWNLOAD_URL)
|
.load(DOWNLOAD_URL)
|
||||||
//.addHeader("groupName", "value")
|
//.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
|
||||||
.addHeaders(map)
|
.addHeader("Accept-Encoding", "gzip, deflate")
|
||||||
|
.addHeader("DNT", "1")
|
||||||
|
//.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0")
|
||||||
//.setRequestMode(RequestEnum.POST)
|
//.setRequestMode(RequestEnum.POST)
|
||||||
.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/ggsg1.apk")
|
.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/ggsg1.apk")
|
||||||
.resetState()
|
.resetState()
|
||||||
|
@@ -39,7 +39,7 @@ task clean(type: Delete) {
|
|||||||
ext {
|
ext {
|
||||||
userOrg = 'arialyy'
|
userOrg = 'arialyy'
|
||||||
groupId = 'com.arialyy.aria'
|
groupId = 'com.arialyy.aria'
|
||||||
publishVersion = '3.3.15'
|
publishVersion = '3.3.16_dev'
|
||||||
// publishVersion = '1.0.3' //FTP插件
|
// publishVersion = '1.0.3' //FTP插件
|
||||||
repoName='maven'
|
repoName='maven'
|
||||||
desc = 'android 下载框架'
|
desc = 'android 下载框架'
|
||||||
|
Reference in New Issue
Block a user