Android入门:多线程断点下载一、多线程断点下载介绍所谓的多线程断点下载就是利用多线程下载,并且可被中断,
Android入门:多线程断点下载
一、多线程断点下载介绍
所谓的多线程断点下载就是利用多线程下载,并且可被中断,如果突然没电了,重启手机后可以继续下载,而不需要重新下载;
利用的技术有:SQLite存储各个线程的下载量,HTTP请求获得下载数据;
二、辅助类介绍
为了完成多线程断点下载我们需要预先编写一些辅助类:
(1)DBOpenHelper
(2)FileService:
-Map<Integer,Integer> getData(String path); 根据URL获得各个线程的下载量
-save(String path, Map<Integer, Integer> map);存储URL对应的各个线程下载量,此函数为刚刚开始时调用
-update(String path, Map<Integer, Integer> map);更新数据库中URL对应的各个线程的下载量;
-delete(String path);删除URL对应的数据;
(3)FileDownloader:
-getFileSize();获得下载文件的大小
-download(DownloadProgressListener listener);下载文件,并设置监听器
(4)DownloadThread:此类在FileDownloader的download中执行;
先将辅助类列出:
DBOpenHelper.java
package net.download;//下载监听器public interface DownloadProgressListener {public void onDownloadSize(int size);}三、具体代码
效果如下:

package org.xiazdong.download;import java.io.File;import net.download.DownloadProgressListener;import net.download.FileDownloader;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private Button downloadButton;private EditText urlpathEditText;private TextView percentTextView;private ProgressBar progressBar;private Handler handler;//主线程private class UIHandler extends Handler{@Overridepublic void handleMessage(Message msg) {int downloadsize = msg.getData().getInt("downloadsize");int percent = msg.getData().getInt("percent");progressBar.setProgress(downloadsize);percentTextView.setText(percent+"%");}}private OnClickListener listener = new OnClickListener() {DownloadThread thread;class DownloadThread extends Thread{private String url ;private File saveDir;private FileDownloader download;public DownloadThread(String url, File saveDir) {this.url = url;this.saveDir = saveDir;}//子线程@Overridepublic void run() {download = new FileDownloader(MainActivity.this,url, saveDir, 3);progressBar.setMax(download.getFileSize());//设置最大刻度try {download.download(downListener);} catch (Exception e) {e.printStackTrace();}}}//由子线程调用private DownloadProgressListener downListener = new DownloadProgressListener() {@Overridepublic void onDownloadSize(int size) {//实时跟踪下载的情况int percent = (int)(((double)size)/progressBar.getMax()*100);Message msg = new Message();msg.what = 1;//设置idSystem.out.println(percent+"%");System.out.println(size+"k");msg.getData().putInt("percent", percent);msg.getData().putInt("downloadsize",size);handler.sendMessage(msg);}};@Overridepublic void onClick(View v) {if(v==downloadButton){if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){String url = urlpathEditText.getText().toString();File saveDir = Environment.getExternalStorageDirectory();download(url,saveDir);}else{Toast.makeText(MainActivity.this, "SDCARD不存在", Toast.LENGTH_SHORT).show();}}}private void download(String url, File saveDir) {thread = new DownloadThread(url,saveDir);thread.start();}};@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); downloadButton = (Button)findViewById(R.id.download); urlpathEditText = (EditText)findViewById(R.id.path); percentTextView = (TextView)findViewById(R.id.textView); progressBar = (ProgressBar)findViewById(R.id.progressBar); downloadButton.setOnClickListener(listener); handler = new UIHandler(); }}