android多线程下载

来源:互联网 发布:mysql 索引失效 编辑:程序博客网 时间:2024/06/01 09:26

 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为单个线程已经下载的大小}


0 0
原创粉丝点击