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

}

}

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

<!--EndFragment-->

更多相关文章

  1. ch016 Android(安卓)自定义对话框.
  2. ch031 Android(安卓)AsyncTask
  3. Android(安卓)- 自定义SeekBar
  4. android studio 在线更新android sdk,遇到无法Fetching https://d
  5. Android应用程序进程启动过程(后篇)
  6. android 中文粗体
  7. Android异步任务
  8. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线
  9. 使用AsyncTask异步更新UI界面

随机推荐

  1. Android(安卓)Preference Summary中实时
  2. android UI 优化系列之 创建RGB565的缓存
  3. Android(安卓)URI简介
  4. Android Notes(06) - Touch事件分发响应
  5. android studio logcat 打印不出信息
  6. 在Windows7下构建Android的开发环境
  7. [Android] - 官方轉換dp, sp 至 pixel的
  8. 如何打log 检查 Android CTS failure
  9. Camera源码分析(android2.2)
  10. [置顶] Android(安卓)怎么退出整个应用程