android多线程下载

 android实现多线程下载碰到的问题及解决方案

1,网络请求 只能放在子线程中进行,要是放在主线程中会报错

URL url1 = newURL(url);
connection=(HttpURLConnection)url1.openConnection();
connection.setConnectTimeout(8000);
connection.setRequestMethod("GET"); 

2,Toast显示消息放在子线程中要在在其前后加上Looper中两个方法
Looper.
prepare();
Toast.
makeText(context,"Thread"+ threadId+ "下载成功", Toast.LENGTH_SHORT).show();
Looper.
loop();

3,多线程下载思路:将一个文件分为多块,每个线程下载对应的块大小,网络端怎么知道我要下载的大小,


long blcok = blcok = blcok = fSize % threadSize == 0 ? fSize / threadSize : fSize / threadSize + 1;
//线程下载的开始位置
if (threadId == 0)
    startPosition = threadId * block;
else
    startPosition = threadId * block + 1;

Log.d("test", "thread " + threadId + "startPosition: " + startPosition);
//线程下载的结束位置
endPostion = startPosition + block > fSize ? fSize : startPosition + block;
//解决java.lang.IllegalStateException: Cannot set request property after connection is made,错误,
在下载文件的代码中重新建立连接
 HttpURLConnection connection=(HttpURLConnection)new URL(url).openConnection();
// connection.setAllowUserInteraction(true);
 connection.setRequestProperty("Range","bytes="+startPosition+"-"+endPostion);

connection.setRequestProperty("Range","bytes="+startPosition+"-"+endPostion);//这句可以确定我们线程要下载的大小


4,怎么知道要下载的文件大小,及文件的是按什么类型的数据下载

在HttpHttpURLConnection中getContentLength()可以获取文件的大小返回的是字节大小

文件是按字节在网络端存储所以应该按字节类型下载,而如何下载呢,可以利用HttpURLConnection对象的

getInputStream()获取InputStream输入流放到BufferedInputStream中,根据BufferedInputStream的read方法可以读取网络端数据,可以将读取的数据放入一个缓冲区,缓冲区bytes []buff=new bytes[1024*1024];中
获取网络端的数据后将其写入到本地这里可以运用RandomAccessFile write = new RandomAccessFile(downFile, "rw");downFile为文件,"rw"为可读可写
write.seek(startPosition);//这句是设置每个线程的写入的开头,以便连接下载好的文件
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
while ((len = bis.read(buff, 0, buff.length)) != -1) {
    write.write(bufff,0,len);
    count+=len;//count为单个线程已经下载的大小
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值