`

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

相关推荐

    php支持断点续传的下载远程文件的类

    请注意,这只是一个基础的实现,实际应用中可能需要考虑更多细节,如错误处理、网络中断后的重试机制、验证服务器返回的`Accept-Ranges`头来确保支持断点续传,以及更精确的进度跟踪等。 在使用此类时,首先实例化`...

    CH341SER_ANDROID.ZIP_340手机驱动_CH341SER_ANDROID_CH34xUARTDemo_ch34

    标题中的"CH341SER_ANDROID.ZIP_340手机驱动_CH341SER_ANDROID_CH34xUARTDemo_ch34"表明这是一个与CH341系列USB转UART(通用异步收发传输器)驱动相关的压缩包,主要用于Android设备。其中"340手机驱动"指的是该驱动...

    CH341SER-ANDROID(CH34XUARTDriver.jar)

    CH341SER_ANDROID(CH34XUARTDriver.jar),配有CH34X系列芯片串口Android程序开发文档,如何使用芯片的 USB 转异步串口功能(以下简称 CH34XUART)以及 GPIO 功能,以及 Android 下如何使用 APK 操作实现串口通讯。...

    Android_CH34xUARTDemo-master.zip_CH34xUARTDemo_Hartusb_android_a

    《Android CH34xUARTDemo: USB Host OTG 转口模块详解》 在现代移动设备中,Android操作系统以其开放性和灵活性深受开发者喜爱。在Android系统中,USB Host功能允许设备连接并控制其他USB设备,如键盘、鼠标或者...

    基于USB单片机CH559的Android USB通讯设计实例-Android Open Accessory Protocol 2_0 Android Open Source.zip

    本实例探讨了如何使用CH559 USB单片机实现与Android设备的通讯,利用Android Open Accessory Protocol 2.0 (AOA 2.0) 协议进行数据交换。这一技术允许开发人员创建兼容Android系统的外部硬件设备,从而拓展手机或...

    安卓源码 Android 沁恒USB转串口芯片 CH340 通信程序

    安卓接CH340实现串口通信源码,可设置波特率等参数

    android 串口通信转usb的jar包CH34xUARTDriver.zip

    本资源“android 串口通信转usb的jar包CH34xUARTDriver.zip”提供了一个解决此问题的解决方案,它包含了实现Android设备通过USB接口与采用CH34x系列芯片(如CH340、CH341)的串口设备进行通信的Java库。 CH34x系列...

    CH341 Android代码

    "CH341 Android代码"这个标题暗示了我们即将探讨的是与Android应用程序开发相关的源代码,可能是一个项目、一个库或者一个工具的实现。在这个场景中,CH341可能是项目代号或者是某个硬件接口(如CH341芯片,常用于...

    android CH34x 发送与接收数据

    在Android平台上进行CH34x芯片的USB通信是嵌入式开发中的常见任务,尤其对于需要与硬件设备交互的应用来说。CH34x系列芯片是由韦尔奇科技(Wch Chip)开发的一组USB到串口控制器,广泛用于USB转串口适配器,使得通过...

    安卓系统USB转串口_CH340驱动小Demo

    本示例“安卓系统USB转串口_CH340驱动小Demo”聚焦于如何利用CH340芯片在Android设备上实现这一功能。CH340是一款广泛使用的通用串行总线(USB)到串行接口转换器,它允许我们将标准的串行通信接口(如RS-232)与USB...

    ch函数间断点及其分类PPT课件.pptx

    ch函数间断点及其分类PPT课件.pptx

    ch函数间断点及其分类学习教案.pptx

    ch函数间断点及其分类学习教案.pptx

    CH341SER_ANDROID[官方demo].zip

    标题 "CH341SER_ANDROID[官方demo].zip" 暗示了这是一个与CH341SER设备驱动相关的Android应用程序的官方演示示例。CH341SER是一款USB到串口控制器,常用于电子爱好者和开发者的项目中,如Arduino和其他微控制器的...

    CH341 serial for android

    标题中的“CH341 serial for android”指的是一个专为Android设备设计的驱动程序或应用程序,它使得用户能够在具有OTG(On-The-Go)功能的Android手机或平板电脑上使用CH341系列USB转串口模块。CH341系列芯片是由...

    Android CH34X串口转USB.zip

    在这种情况下,"Android CH34X串口转USB.zip"是一个关键资源,它包含了一个解决方案,允许开发者通过Android设备连接并控制使用CH341芯片的串口转USB设备。CH341芯片是一种常用的接口转换器,能够将串行通信接口(如...

    ch05 Android布局

    本章"ch05 Android布局"着重探讨如何有效地设计和管理Android应用的用户界面,包括基本布局管理器、自定义布局以及性能优化策略。 一、基础布局管理器 Android提供了多种内置的布局管理器,如线性布局...

    CH341PAR_ANDROID.ZIP

    测试有效的OTG-安卓驱动 CH340G,CH340T,CH340C,CH340N, CH340K, CH340E,CH340B,CH341A,CH341F, CH341T,CH341B,CH341C,CH341U CH340/CH341的USB转串口安卓免驱应用库,用于Android操作系统3.1及以上版本的...

    Androidsdk范例大全(CH03-CH05)

    该资源包含CH03至CH05章节的源码,为开发者提供了丰富的学习素材,旨在帮助他们更好地理解和掌握Android SDK的各种功能和特性。 CH03章节通常会涵盖Android应用的基本架构和组件,例如Activity、Intent、Service、...

    Android SDK开发范例大全(第二版)CH05.rar

    《Android SDK开发范例大全(第二版)CH05》是针对Android应用开发的一份重要资源,由清华大学出版社出版。这个压缩包包含了第五章的源代码,为开发者提供了丰富的实践示例,帮助深入理解Android SDK的使用。在这个...

    stm32g030 ch395 以太网串口透传demo cubeide

    在这个演示项目中,我们将展示如何使用STM32G030微控制器与CH395以太网控制芯片结合,实现一个以太网串口透传的功能。这个项目不仅展示了STM32G030强大的处理能力和丰富的外设接口,还突显了CH395以太网控制芯片的...

Global site tag (gtag.js) - Google Analytics