android多线程下载数据,Android应用开发之多线程断点续传下载文件

原标题:Android应用开发之多线程断点续传下载文件

一个简单的界面:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

android:id="@+id/et_path"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="请输入下载路径(网址):" />

android:id="@+id/et_threadCount"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="请输入开启线程数量(建议不超过5):" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="click"

android:text="开始下载" />

android:id="@+id/ll_pb"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

item.xml:

<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/progressBar1"

style="?android:attr/progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

代码:

package org.dreamtech.download;

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;

import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.view.View;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ProgressBar;

public class MainActivity extends Activity {

private EditText et_path;

private EditText et_threadCount;

private LinearLayout ll_pb_layout;

private static int runningThread;

private String path;

private int threadCount;

private List pbLists;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_path = (EditText) findViewById(R.id.et_path);

et_threadCount = (EditText) findViewById(R.id.et_threadCount);

ll_pb_layout = (LinearLayout) findViewById(R.id.ll_pb);

pbLists = new ArrayList();

}

public void click(View v) {

path = et_path.getText().toString().trim();

threadCount = Integer.parseInt(et_threadCount.getText().toString()

.trim());

ll_pb_layout.removeAllViews();

pbLists.clear();

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

ProgressBar pbView = (ProgressBar) View.inflate(

getApplicationContext(), R.layout.item, null);

pbLists.add(pbView);

ll_pb_layout.addView(pbView);

}

new Thread() {

public void run() {

try {

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();

conn.setRequestMethod("GET");

conn.setConnectTimeout(5000);

int code = conn.getResponseCode();

if (code == 200) {

int length = conn.getContentLength();

runningThread = threadCount;

System.out.println("length:" + length);

RandomAccessFile rafAccessFile = new RandomAccessFile(

getFilename(path), "rw");

rafAccessFile.setLength(length);

int blockSize = length / threadCount;

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

int startIndex = i * blockSize;

int endIndex = (i + 1) * blockSize - 1;

if (i == threadCount - 1) {

endIndex = length - 1;

}

DownLoadThread downLoadThread = new DownLoadThread(

startIndex, endIndex, i);

downLoadThread.start();

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}.start();

}

private class DownLoadThread extends Thread {

private int startIndex;

private int endIndex;

private int threadId;

private int PbMaxSize;

private int pblastPosition;

public DownLoadThread(int startIndex, int endIndex, int threadId) {

this.startIndex = startIndex;

this.endIndex = endIndex;

this.threadId = threadId;

}

@Override

public void run() {

try {

PbMaxSize = endIndex - startIndex;

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();

conn.setRequestMethod("GET");

conn.setConnectTimeout(5000);

File file = new File(Environment.getExternalStorageDirectory()

.getPath()

+ "/"

+ getFilename(path)

+ threadId

+ ".txt");

if (file.exists() && file.length() > 0) {

FileInputStream fis = new FileInputStream(file);

BufferedReader bufr = new BufferedReader(

new InputStreamReader(fis));

String lastPositionn = bufr.readLine();

int lastPosition = Integer.parseInt(lastPositionn);

pblastPosition = lastPosition - startIndex;

startIndex = lastPosition + 1;

fis.close();

}

conn.setRequestProperty("Range", "bytes=" + startIndex + "-"

+ endIndex);

int code = conn.getResponseCode();

if (code == 206) {

RandomAccessFile raf = new RandomAccessFile(

getFilename(path), "rw");

raf.seek(startIndex);

InputStream in = conn.getInputStream();

int len = -1;

byte[] buffer = new byte[1024 * 1024];

int total = 0;

while ((len = in.read(buffer)) != -1) {

raf.write(buffer, 0, len);

total += len;

int currentThreadPosition = startIndex + total;

RandomAccessFile raff = new RandomAccessFile(

getFilename(path) + threadId + ".txt", "rwd");

raff.write(String.valueOf(currentThreadPosition)

.getBytes());

raff.close();

pbLists.get(threadId).setMax(PbMaxSize);

pbLists.get(threadId).setProgress(

pblastPosition + total);

}

raf.close();

synchronized (DownLoadThread.class) {

runningThread--;

if (runningThread == 0) {

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

File delteFile = new File(getFilename(path) + i

+ ".txt");

delteFile.delete();

}

}

}

}

} catch (Exception e) {

}

}

}

public String getFilename(String path) {

int start = path.lastIndexOf("/") + 1;

String subString = path.substring(start);

String filename = Environment.getExternalStorageDirectory().getPath()+"/"+subString;

return filename;

}

}

开权限:

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值