`

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
分享到:
评论

相关推荐

    ch11_android开发_

    Android Studio内置了一个强大的调试器,允许开发者逐行运行代码,查看变量值,设置断点,以及检查内存状态等。在开发过程中,我们可以通过`Debug`模式启动应用,然后在源代码中设置断点,当程序执行到断点时会暂停...

    android ophone开发完全讲义源码ch06

    在Android Ophone开发中,Chapter 6(ch06)通常涵盖了系统架构、应用程序组件、UI设计、数据存储以及网络通信等关键知识点。这个压缩包可能包含了一系列的代码示例、教程文档或项目实例,旨在帮助开发者深入理解...

    android开发权威指南(第二版)源代码

    - 调试技巧:使用Android Studio的调试工具进行断点调试、日志查看等。 通过这些源代码,读者可以逐步掌握Android开发的核心技术,包括UI设计、组件交互、数据存储、网络通信等多个方面。实践中遇到的问题,可以...

    android手机 OTG功能调试usb串口的demo源码程序,可在android studio运行调试

    - 由于标签中提到了“串口”,很可能这个项目依赖于特定的USB串口库,例如` Android-USB-Serial-for-Android `,这是一个开源库,用于与各种常见的USB转串口芯片(如FTDI、CH340等)通信。 - 这个库可能封装了与...

    ch09_remoteinstallapk.rar

    下载过程中需要处理网络连接的异常,以及断点续传以确保大文件的完整下载。如果使用OkHttp,其强大的缓存机制可以优化用户体验。 安装APK则需要用到`Intent`和`PackageInstaller`类。你可以创建一个指向下载完成的...

    安卓入门经典ch04

    总的来说,"安卓入门经典ch04"的电子词典案例深入浅出地介绍了安卓应用的基本构造和功能实现,对于初学者来说是一个很好的起点,涵盖了从界面设计到后台数据管理的全方位知识。通过实践这个项目,你可以掌握安卓开发...

Global site tag (gtag.js) - Google Analytics