摘要:本文将带你了解Android应用开发Android开发之断点续传(下载),希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android开发之断点续传(下载),希望本文对大家学Android有所帮助。
DownloadUtils
public class DownloadUtils {
private static final String TAG = "DownloadUtils";
private static volatile DownloadUtils instance;
private File file;
private String filePath;
private OkHttpClient client;
private File downloadFile;
private long startPosition;
private Call call;
private DownloadUtils() {
client = new OkHttpClient();
}
private DownloadListener listener;
public void setListener(DownloadListener listener) {
this.listener = listener;
}
/**
* 初始化下载父路径
*
* @param path
*/
public void initDownload(String path) {
file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
if (!file.exists()) {
file.mkdir();
}
filePath = file.getAbsolutePath();
Log.i(TAG, "initDownload: " + filePath);
}
public static DownloadUtils getInstance() {
if (null == instance) {
synchronized (DownloadUtils.class) {
if (instance == null) {
instance = new DownloadUtils();
}
}
}
return instance;
}
public void startDownload(String url) {
if (TextUtils.isEmpty(url)) {
return;
}
if (url.contains(".")) {
String typeName = url.substring(url.lastIndexOf(".") + 1);
if (url.contains("/")) {
String name = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
String fn = name + "." + typeName;
downloadFile = new File(file, fn);
}
}
startPosition = 0;
if (downloadFile.exists()) {
startPosition = downloadFile.length();
}
Request request = new Request.Builder()
.addHeader("RANGE", "bytes=" + startPosition + "-")
.url(url)
.build();
call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
listener.startDownload();
ResponseBody body = response.body();
long totalLength = body.contentLength() + startPosition;
Log.i(TAG, "totalLength: " + totalLength + "----");
InputStream is = body.byteStream();
byte[] buf = new byte[2048];
int length = 0;
long totalNum = startPosition;
RandomAccessFile raf = new RandomAccessFile(downloadFile, "rw");
raf.seek(totalNum);
while ((length = is.read(buf, 0, buf.length)) != -1) {
raf.write(buf, 0, length);
totalNum += length;
listener.downloadProgress(totalNum * 100 / totalLength);
}
Log.i(TAG, "totalNum==" + totalNum + "---");
listener.finishDownload(downloadFile.getAbsolutePath());
body.close();
}
});
}
public void pauseDownload() {
listener.pauseDownload();
if (call != null && call.isExecuted()) {
call.cancel();
}
}
}
DownloadListener
public interface DownloadListener {
void startDownload();
void pauseDownload();
void finishDownload(String path);
void downloadProgress(long progress);
}
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_pro;
private ProgressBar progressBar;
private Button btn_start;
private Button btn_pause;
private String downloadUrl = "https://acj3.pc6.com/pc6_soure/2017-12/com.yek.android.kfc.activitys_3820.apk";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号