Android---多线程下载

briansxuan briansxuan 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
[b][/b]package com.itheima.thread;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.itheima.handlerutils.HandlerUtils;

import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

public class MainActivity extends Activity {

private HandlerUtils utils = new HandlerUtils(this);
private List<ProgressBar> list = new ArrayList<ProgressBar>();
private LinearLayout ll =null;
private SharedPreferences sp = null;
private EditText text =null;
//记录每个线程下载的字节数
private int thread_len = 0;
//数据的总长度
private int len = 0;
//线程的个数
private int thread_num = 0;
private EditText edit_url = null;
private int recardThread = 0;
private long time = System.currentTimeMillis();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//访问的url
edit_url = (EditText) this.findViewById(R.id.edit_url);
text = (EditText)this.findViewById(R.id.num);
this.sp = getSharedPreferences("info", MODE_PRIVATE);
this.ll = (LinearLayout) findViewById(R.id.ll);
}
public void show(View v){
//要开启的总线程个数
thread_num=Integer.parseInt(text.getText().toString());

for(int i=0;i<thread_num;i++){
ProgressBar pb = (ProgressBar) View.inflate(MainActivity.this, R.layout.item, null);
ll.addView(pb);
list.add(pb);
}
//获取数据的长度
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(edit_url.getText().toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.connect();
int code = conn.getResponseCode();
if(code == 200){
//获取资源的长度
len = conn.getContentLength();
}else{
//访问网络失败
//Message msg = Message.obtain();
utils.makeToast("访问网络失败,状态码为"+code);
}
//每个线程所下载的字节数长度
thread_len = len/thread_num;
System.out.println("共有"+thread_num+"个线程");
recardThread = thread_num;
//循环每个线程从开始到结束下载的位置
for(int i=1;i<=thread_num;i++){
int begin = sp.getInt("t"+i, (i-1)*thread_len);
//int begin = (i-1)*thread_len;
int end = (thread_num==i) ? len-1:begin+thread_len-1;
startThread(i,begin,end);
}


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
utils.makeToast("访问网络失败");
}
}
}).start();
}
//开启子线程
protected void startThread(final int i, final int begin, final int end) {
System.out.println("第"+i+"个线程:"+begin+"---->"+end);

// TODO Auto-generated method stub
new Thread(new Runnable() {

@Override
public void run() {
try {
ProgressBar pb=list.get(i-1);
pb.setMax(thread_len);
URL url = new URL(edit_url.getText().toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestProperty("Range", "bytes="+begin+"-"+end);
conn.connect();
if(conn.getResponseCode()==206){
InputStream in = conn.getInputStream();
//写出文件的流
String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/news.zip";
RandomAccessFile asf = new RandomAccessFile(path, "rwd");
//移动游标
asf.seek(begin);
byte[] buffer = new byte[10240];
int len = 0;
int savePoint = begin;
while((len=in.read(buffer))!=-1){
asf.write(buffer, 0, len);
Editor edit = sp.edit();
savePoint = savePoint+len;
edit.putInt("t"+i, savePoint);
edit.commit();
//更新进度
pb.setProgress(savePoint-(i-1)*thread_len);
}
asf.close();
in.close();
utils.makeToast("线程"+i+"下载完毕");
System.out.println("线程"+i+"下载完毕");
recardThread--;
if(recardThread == 0){
long l = System.currentTimeMillis();
System.out.println("共耗时:"+(l-time)/1000+"秒");
System.out.println("整个文件下载完毕");
utils.makeToast("文件全部下载完毕");
Editor edit = sp.edit();
edit.clear();
edit.commit();

}
}else{
utils.makeToast("线程"+i+"下载出现错误");
System.out.println("线程"+i+"下载出现错误");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
utils.makeToast("线程"+i+"下载失败");
System.out.println("线程"+i+"下载失败");
}
}
}).start();

}
}
...全文

相关推荐

安卓应用源码android多线程断点下载

安卓应用源码中实现android多线程断点下载的核心思想在于将大文件分割成小块,利用多个线程并发下载这些小块,以便于充分利用网络资源,同时提高下载速度。

codemami

Android高效多线程文件下载实现

本文还有配套的精品资源,点击获取 简介:本项目为Android平台上的"down_ANDROID",重点讲解如何使用Download Service在后台高效下载大文件,以及多线程技术加速下载过程。通过该示例项目,开发者可以了解如何创建自定义下载管理器,实现文件的下载、暂停、恢复和取消等操作。实现步骤包括初始化下载任务、设置请求头、创建多线程、下载部分文件、保存本地文件、合...

李大锤同学

安卓项目源码Android多线程断点下载源码

安卓项目的多线程断点下载源码是一个复杂而实用的模块,它不仅要求开发者掌握Java多线程编程的技巧,还需要了解Android的文件操作和网络通信机制。

codemami

安卓Android源码——安卓Android快速框架+多线程下载框架的技术.rar

本资源"安卓Android源码——安卓Android快速框架+多线程下载框架的技术"提供了深入理解Android平台下的应用程序开发,特别是涉及到Afinal和Gson这两个关键库的使用。

易小侠

安卓Android源码——android多线程断点下载.zip

综上所述,"安卓Android源码——android多线程断点下载.zip"提供了实现高效且用户友好的下载功能的参考实例,涵盖了多线程、断点续传、文件分块、HTTP请求、进度同步等多个关键知识点,是安卓开发者学习和实践下载功能的宝贵资源

易小侠
评论
收藏 已收藏
分享
返回顶部
briansxuan
Java 51,407 成员 86,128 内容