`

ch028 Android 断点续传

阅读更多

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

<manifest xmlns: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-permission android:name="android.permission.INTERNET" />

    <!-- sdcard权限 -->

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

    <uses-permission android: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>

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

 

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

            </intent-filter>

        </activity>

    </application>

 

</manifest>

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

<LinearLayout xmlns: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-------------------------------------

package com.ch28;

 

import java.io.File;

import java.io.IOException;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

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.ProgressBar;

 

/**

 * 

 * 项目名称:com.ch28    

 * 类名称:MainActivity    

 * 类描述:断点下载 

 * 创建人:方勇   

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

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

 */

public class MainActivity extends Activity implements OnClickListener {

 

private Button btn;

private ProgressBar pbar;

 

/* 文件总大小 */

private int fileSize;

/* 已下载大小 */

private int downloadsize;

/* 文件存放路径 */

private String path;

/* 更新进度条的值 */

private Handler handler = new Handler() {

 

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

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

}

 

};

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViews();

setListeners();

initdata();

}

 

private void findViews() {

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

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

}

 

private void setListeners() {

btn.setOnClickListener(this);

}

 

private void initdata() {

pbar.setVisibility(View.GONE);

pbar.setMax(100);

pbar.setProgress(0);

}

 

@Override

public void onClick(View v) {

/* 获取SDcard */

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

File file = new File(path);

if (!file.exists()) {

file.mkdir();

}

/* 下载操作 */

new Thread(new DownLoadTask()).start();

/* 显示进度条 */

pbar.setVisibility(View.VISIBLE);

}

 

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

class DownLoadTask implements Runnable {

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

private int blocksize;

/* 默认为5个线程 */

private int threadNum = 5;

/* 下载后的文件名 */

private String filename = "apache.zip";

 

@Override

public void run() {

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

FileDownLoad[] fileDownLoads = new FileDownLoad[threadNum];

/* 计算总大小 */

URL url;

try {

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

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

/* 计算下载量 */

fileSize = conn.getContentLength();

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

blocksize = fileSize / threadNum;

/* 执行下载操作 */

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

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

int begin = i * blocksize;

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

int end = (i + 1) * blocksize - 1;

FileDownLoad thread = new FileDownLoad(url, begin, end, path + filename);

thread.start();

fileDownLoads[i] = thread;

}

 

/* 更新UI */

boolean flag = false;

while (!flag) {

flag = true;

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

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

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

flag = false;

}

}

MainActivity.this.handler.sendEmptyMessage(0);

Thread.sleep(1000);

}

catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

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

package com.ch28;

 

import java.io.BufferedInputStream;

import java.io.File;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.net.URL;

import java.net.URLConnection;

 

/*下载线程*/

public class FileDownLoad extends Thread {

 

private URL url;

private int begin;

private int end;

private int current;

private String filename;

/*缓冲输入流*/

private BufferedInputStream buffin;

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

private RandomAccessFile raf;

/*缓冲大小*/

byte[] buffsize = new byte[1024];

/*已经下载大小*/

private int downloadsize;

private boolean isFinish;

 

public int getDownloadsize() {

return downloadsize;

}

public boolean isFinish() {

return isFinish;

}

 

public FileDownLoad(URL url, int begin, int end, String filename) {

super();

this.url = url;

this.begin = begin;

this.end = end;

this.filename = filename;

}

@Override

public void run() {

try {

URLConnection conn = url.openConnection();

/*指定下载的范围*/

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

conn.setAllowUserInteraction(true);

/*做缓冲优化处理*/

buffin = new BufferedInputStream(conn.getInputStream());

/*写入本地文件*/

raf = new RandomAccessFile(new File(filename), "rw");

/*移动到新的位置*/

raf.seek(begin);

 

while(current<end){

int size = 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 (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

super.run();

}

 

}

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

<!--EndFragment-->

  • 大小: 84.6 KB
  • 大小: 87 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics