这里的断点续传使用了Xutils框架
首先在studio的gradle里的
defaultConfig
配置
useLibrary 'org.apache.http.legacy'
然后权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/>
然后布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.longfei.viewpagerwuxian.MainActivity"> <TextView android:layout_width="match_parent" android:text="下载" android:gravity="center" android:id="@+id/tv" android:layout_height="40dp"/> <ProgressBar android:id="@+id/pro" android:layout_width="match_parent" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_height="20dp"/> </LinearLayout> package com.example.downloaddemo1409g; import java.io.File; import com.lidroid.xutils.HttpUtils; import com.lidroid.xutils.exception.HttpException; import com.lidroid.xutils.http.HttpHandler; import com.lidroid.xutils.http.ResponseInfo; import com.lidroid.xutils.http.callback.RequestCallBack; import android.app.Activity; import android.os.Bundle; import android.text.format.Formatter; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends Activity { private static final String URL = "http://dldir1.qq.com/qqfile/qq/QQ8.4/18380/QQ8.4.exe"; // 用于显示 下载量/总的大小 private TextView mTv; // 进度条 private ProgressBar mPb; private long mTotal;//文件总大小 //HttpUtils相关 private HttpUtils mHttp; private HttpHandler<File> mDownloadHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建HttpUtils对象 mHttp = new HttpUtils(); // 查找view initView(); // 添加事件 initEvent(); // 开始下载 startDownload(); } private void initEvent() { mTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isCancelled = mDownloadHandler.isCancelled(); if (isCancelled) { // 暂停状态时,点击继续下载 startDownload(); } else { // 正在下载状态时,点击后取消下载 mDownloadHandler.cancel(); } } }); } private void initView() { mTv = (TextView) findViewById(R.id.tv); mPb = (ProgressBar) findViewById(R.id.pro); // 设置最大值100 mPb.setMax(100); } private void startDownload() { mDownloadHandler = mHttp.download(URL, "/mnt/sdcard/qq.exe", true, true, new RequestCallBack<File>() { @Override public void onLoading(long total, long current, boolean isUploading) { mTotal = total; // 下载过程中 String totalSize = Formatter.formatFileSize(MainActivity.this, total); // 格式化文件大小 String currentSize = Formatter.formatFileSize(MainActivity.this, current); // 显示 下载量/总的大小 mTv.setText(currentSize + "/" + totalSize); // 计算并显示进度值 int percent = (int) (current * 100 / total); mPb.setProgress(percent); } @Override public void onSuccess(ResponseInfo<File> responseInfo) { // 下载成功 if (responseInfo.result.length() == mTotal) { mTv.setText("下载完成"); } } @Override public void onFailure(HttpException error, String msg) { // 下载失败 mTv.setText("下载失败"); } }); } } 原理 断点续传: 1:当用户点击下载按钮是就要把文件路径的信息传给后台由service的onstartcom的方法接受穿过来的参数,由于service和activity都是主线程不能做耗时操作所以要开启一个子线程去做耗时操作网络下载和把数据写到本地文件并且把进度信息本地文件保存到数据库并把进度传给activity通过广播发送网络文件 网络下载的关键点: 1:获取网络文件的长度 2:在本地创建一个文件,设置其长度 3:从数据库中获取上次下载的进度 4:从上次下载的位置下载数据,同时保存进度到数据库 5将下载进度回传activity 6:下载完成后删除下载信息