Android多线程实现文件断点下载

download_main_layout.xml:

<LinearLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/down_load_edt" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:hint="请输入下载文件的网址!" /> <Button android:layout_marginTop="20dp" android:id="@+id/down_load_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击下载" /> <ProgressBar android:id="@+id/down_load_pbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>

下载入口Activity:

public class MainActivity extends Activity implements OnClickListener {/**下载文件按钮 */private Button downLoadBtn;/**下载文件地址 */private EditText downLoadEdt;/**下载进度 */private ProgressBar downLoadPbar;/**定义发送消息的字段*/private static final int MESSAGE_NUMBER = 1;/**所要下载文件总大小 */private int fileSize;/**已下载大小 */private int downLoadSize;/**所下载文件的保存路径 */private String path;/**更新进度条的值 */private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == MESSAGE_NUMBER) {/**设置进度*/downLoadPbar.setProgress(Double.valueOf(downLoadSize * 1.0 / fileSize * 100).intValue());}}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.download_activity_main);findViews();setListeners();initdata();}private void findViews() {downLoadEdt=(EditText) findViewById(R.id.down_load_edt);downLoadBtn = (Button) findViewById(R.id.down_load_btn);downLoadPbar = (ProgressBar) findViewById(R.id.down_load_pbar);}private void setListeners() {downLoadBtn.setOnClickListener(this);}private void initdata() {downLoadPbar.setVisibility(View.GONE);downLoadPbar.setMax(100);downLoadPbar.setProgress(0);}@Overridepublic void onClick(View v) {/**获取SDcard */path = Environment.getExternalStorageDirectory() + "/downloads/";File file = new File(path);if (!file.exists()) {file.mkdir();}/**下载操作 */new Thread(new DownLoadTask()).start();/**显示进度条 */downLoadPbar.setVisibility(View.VISIBLE);}/**子线程,计算下载量,更新UI */class DownLoadTask implements Runnable {/**线程块大小,每个线程的下载量 */private int blockSize;/** 默认为5个线程 */private int threadNum = 5;/** 下载后的文件名 */private String fileName = "myDownLoad.zip";@Overridepublic void run() {/**数组保存线程对象,便于后面的每个线程下载量计算总和 */DownLoadThread[] fileDownLoads = new DownLoadThread[threadNum];/** 计算总大小 */URL url;try {url = new URL(downLoadEdt.getText().toString().trim());HttpURLConnection conn = (HttpURLConnection) url.openConnection();/**计算下载量 */fileSize = conn.getContentLength();/** 计算每个线程的下载量 */blockSize = fileSize / threadNum;/** 执行下载操作 */for (int i = 0; i < threadNum; i++) {/** 每个线程的开始位置 */int begin = i * blockSize;/** 每个线程的结束位置 */int end = (i + 1) * blockSize – 1;DownLoadThread thread = new DownLoadThread(url, begin, end, path + fileName);thread.start();fileDownLoads[i] = thread;}/** 更新UI */boolean flag = false;while (!flag) {flag = true;for (int i = 0; i < threadNum; i++) {downLoadSize += fileDownLoads[i].getDownloadsize();if (!fileDownLoads[i].isFinish()) {flag = false;}}MainActivity.this.handler.sendEmptyMessage(MESSAGE_NUMBER);Thread.sleep(1000);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

下载线程工具类:

在前进的路上,主动搬开别人脚下的绊脚石,有时往往也是为自己铺路。

Android多线程实现文件断点下载

相关文章:

你感兴趣的文章:

标签云: