Android入门:多线程断点上载

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);}


三、具体代码


效果如下:

Android入门:多线程断点上载



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();    }}