--------------------------------------------AndroidManifest.xml---------------------------------

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.ch28"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="15"/>

<!--网络访问权限-->

<uses-permissionandroid:name="android.permission.INTERNET"/>

<!--sdcard权限-->

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

<activity

android:name=".MainActivity"

android:label="@string/title_activity_main">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

</manifest>

--------------------------------------------activity_main.xml------------------------------------

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/LinearLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<Button

android:id="@+id/btn"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="download"/>

<ProgressBar

android:id="@+id/pbar"

android:layout_width="fill_parent"

android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"/>

</LinearLayout>

--------------------------------------------MainActivity.java-------------------------------------

packagecom.ch28;

importjava.io.File;

importjava.io.IOException;

importjava.net.HttpURLConnection;

importjava.net.MalformedURLException;

importjava.net.URL;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.os.Environment;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.ProgressBar;

/**

*

*项目名称:com.ch28

*类名称:MainActivity

*类描述:断点下载

*创建人:方勇

*创建时间:2012-12-7下午4:49:39

*Copyright(c)方勇-版权所有

*/

publicclassMainActivityextendsActivityimplementsOnClickListener{

privateButtonbtn;

privateProgressBarpbar;

/*文件总大小*/

privateintfileSize;

/*已下载大小*/

privateintdownloadsize;

/*文件存放路径*/

privateStringpath;

/*更新进度条的值*/

privateHandlerhandler=newHandler(){

@Override

publicvoidhandleMessage(Messagemsg){

super.handleMessage(msg);

pbar.setProgress(Double.valueOf(downloadsize*1.0/fileSize*100).intValue());

}

};

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViews();

setListeners();

initdata();

}

privatevoidfindViews(){

btn=(Button)findViewById(R.id.btn);

pbar=(ProgressBar)findViewById(R.id.pbar);

}

privatevoidsetListeners(){

btn.setOnClickListener(this);

}

privatevoidinitdata(){

pbar.setVisibility(View.GONE);

pbar.setMax(100);

pbar.setProgress(0);

}

@Override

publicvoidonClick(Viewv){

/*获取SDcard*/

path=Environment.getExternalStorageDirectory()+"/downloads/";

Filefile=newFile(path);

if(!file.exists()){

file.mkdir();

}

/*下载操作*/

newThread(newDownLoadTask()).start();

/*显示进度条*/

pbar.setVisibility(View.VISIBLE);

}

/*子线程,计算下载量,更新UI*/

classDownLoadTaskimplementsRunnable{

/*线程块大小,每个线程的下载量*/

privateintblocksize;

/*默认为5个线程*/

privateintthreadNum=5;

/*下载后的文件名*/

privateStringfilename="apache.zip";

@Override

publicvoidrun(){

/*数组保存线程对象,便于后面的每个线程下载量计算总和*/

FileDownLoad[]fileDownLoads=newFileDownLoad[threadNum];

/*计算总大小*/

URLurl;

try{

url=newURL("http://172.16.121.220:8080/download/apache.zip");

HttpURLConnectionconn=(HttpURLConnection)url.openConnection();

/*计算下载量*/

fileSize=conn.getContentLength();

/*计算每个线程的下载量*/

blocksize=fileSize/threadNum;

/*执行下载操作*/

for(inti=0;i<threadNum;i++){

/*每个线程的开始位置*/

intbegin=i*blocksize;

/*每个线程的结束位置*/

intend=(i+1)*blocksize-1;

FileDownLoadthread=newFileDownLoad(url,begin,end,path+filename);

thread.start();

fileDownLoads[i]=thread;

}

/*更新UI*/

booleanflag=false;

while(!flag){

flag=true;

for(inti=0;i<threadNum;i++){

downloadsize+=fileDownLoads[i].getDownloadsize();

if(!fileDownLoads[i].isFinish()){

flag=false;

}

}

MainActivity.this.handler.sendEmptyMessage(0);

Thread.sleep(1000);

}

}catch(MalformedURLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}

}

--------------------------------------------FileDownLoad.java-----------------------------------

packagecom.ch28;

importjava.io.BufferedInputStream;

importjava.io.File;

importjava.io.IOException;

importjava.io.RandomAccessFile;

importjava.net.URL;

importjava.net.URLConnection;

/*下载线程*/

publicclassFileDownLoadextendsThread{

privateURLurl;

privateintbegin;

privateintend;

privateintcurrent;

privateStringfilename;

/*缓冲输入流*/

privateBufferedInputStreambuffin;

/*写入流,支持断点*/

privateRandomAccessFileraf;

/*缓冲大小*/

byte[]buffsize=newbyte[1024];

/*已经下载大小*/

privateintdownloadsize;

privatebooleanisFinish;

publicintgetDownloadsize(){

returndownloadsize;

}

publicbooleanisFinish(){

returnisFinish;

}

publicFileDownLoad(URLurl,intbegin,intend,Stringfilename){

super();

this.url=url;

this.begin=begin;

this.end=end;

this.filename=filename;

}

@Override

publicvoidrun(){

try{

URLConnectionconn=url.openConnection();

/*指定下载的范围*/

conn.setRequestProperty("Range","bytes="+begin+"-"+end);

conn.setAllowUserInteraction(true);

/*做缓冲优化处理*/

buffin=newBufferedInputStream(conn.getInputStream());

/*写入本地文件*/

raf=newRandomAccessFile(newFile(filename),"rw");

/*移动到新的位置*/

raf.seek(begin);

while(current<end){

intsize=buffin.read(buffsize,0,1024);

/*已经读完*/

if(size==-1){

break;

}

raf.write(buffsize,0,size);

current+=size;

/*下载量*/

downloadsize+=size;

}

isFinish=true;

/*关闭输入流与写入流*/

buffin.close();

raf.close();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

super.run();

}

}

--------------------------------------------效果---------------------------------------------------

ch028 Android 断点续传_第1张图片

ch028 Android 断点续传_第2张图片

<!--EndFragment-->

更多相关文章

  1. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线
  2. 你对进程线程到底理解有多少
  3. C# 多线程--线程池的详细介绍
  4. C#中多线程之Thread类详解
  5. Catalog Service - 解析微软微服务架构实例代码
  6. C#线程控制的实例详解
  7. 介绍一个微软开源项目网站--CodePlex
  8. 使用ConcurrentDictionary多线程同步字典集合实例详解
  9. c#中关于多线程创建对象的示例分享

随机推荐

  1. Android中单元测试
  2. Adnroid LearningNotes
  3. Android listview动态添加删除测试
  4. Android客户端解析web服务器XML数据小问
  5. Android Studio下项目编译出错could not
  6. 导入android studio 项目错误:Error:(1, 0
  7. AAPTerr: No Delegate set : lost messag
  8. Android 学习笔记6 —— Activity 布局学
  9. android资料下载地址汇总
  10. 高性能图片压缩 —— libjpeg-turbo 的编