1、handler是在UI主线程和其他子线程中间传递数据。
首先开启应用时,就会进入UI线程。如果同时需要从网络下载文件等其他操作,若直接在主线程中执行,一旦发生阻塞,整个进程就会暂停,界面就没有响应并强制关闭。所以,我们常常新建子线程来完成对应的操作。通过在主线程中运行handler,利用Message对象把子线程得到的数据传递(sendMessage())给主线程使用。
Message msg = new Message();
msg.what = SERVER_ERROR;
msg.setdata();
handler.sendMessage(msg);
2、多线程下载 http://www.cnblogs.com/yydcdut/p/3796197.html
Android客户端要从服务器上下载资源,首先获取资源大小,并在客户端通过RandomAccessFile建立一个相同大小的临时文件;
选取一定个数的线程来同时下载,并用资源大小除以线程数来获取每个线程下载的文件大小;
同时开启这几个线程来下载,每个线程下载对应位置的文件。
// 在客户端本地创建出来一个大小跟服务器端文件大小一样的临时文件
RandomAccessFile raf;
raf = new RandomAccessFile("/data/data/com.yydcdut.duothread/lala.exe", "rwd");
raf.setLength(length);
raf.close();
// 平均每一个线程下载的文件大小
int blockSize = length / threadCount;
//同时开启线程下载 threadID、threadCount、startIndex、endIndex
for (int threadId = 1; threadId <= threadCount; threadId++) {
// 第一个线程下载的开始位置
int startIndex = (threadId - 1) * blockSize;
int endIndex = threadId * blockSize;
if (threadId == threadCount) {
// 最后个线程下载的长度弄得稍微大一点
endIndex = length;
}
System.out.println("线程:" + threadId + "---下载:"
+ startIndex + "--->" + endIndex);
// 开始下载
new DownloadThread(path, threadId, startIndex,
endIndex).start();
}
}
实际的下载代码:
1、建立了一个txt文件,目的就是将下载到哪的数据存进去,如果网断了再下载的话,实现断点下载,那么下次下载就可以从这里读取数据,然后在写入文件,就不需要重头再分配大小下载了。
例如有threadCount = 3个线程,则建3个txt文件来存数据。1.txt,2.txt,3.txt,依次保存对应threadID的下载内容。
File tempFile = new File("/data/data/com.yydcdut.duothread/" + threadId + ".txt");
设置断点,每次下载的开头位置为 startIndex = downloadlenInt;// 修改下载的真实的开始位置 已经下载的长度
2、下载
创建对应给定URL的HTTP连接。
URL请求的类别分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setRequestProperty("Range", "bytes=" + startIndex + "-"+ endIndex);
获取输入流对象来下载
InputStream is = conn.getInputStream();// 设置请求位置,返回是当前位置对应的文件输入流 // 随机写文件的时候从那个位置开始写
RandomAccessFile raf = new RandomAccessFile("/data/data/com.yydcdut.duothread/lala.exe","rwd");
raf.seek(startIndex);