ch028 Android(安卓)断点续传
--------------------------------------------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-->
更多相关文章
- ch016 Android(安卓)自定义对话框.
- ch031 Android(安卓)AsyncTask
- Android(安卓)- 自定义SeekBar
- android studio 在线更新android sdk,遇到无法Fetching https://d
- Android应用程序进程启动过程(后篇)
- android 中文粗体
- Android异步任务
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线
- 使用AsyncTask异步更新UI界面