android网络框架
来源:互联网 发布:淘宝韩版男装店铺 编辑:程序博客网 时间:2024/06/07 14:07
- volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。
- android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。
- okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确,反例就是UIL(universal image loader),自己做的文件缓存,而且不遵守http缓存机制。
- retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。
另外
- AndroidAsync这个网络库使用了nio的方式实现的。okhttp没有提供nio selector的方式,不过nio更适合大量连接的情况,对于移动平台有点杀鸡用牛刀的味道。
- picasso、uil都不支持inbitmap,项目中有用到picasso的富图片应用需要注意这点。
上传
- /**
- *
- * @param params
- * 传递的普通参数
- * @param uploadFile
- * 需要上传的文件名
- * @param fileFormName
- * 需要上传文件表单中的名字
- * @param newFileName
- * 上传的文件名称,不填写将为uploadFile的名称
- * @param urlStr
- * 上传的服务器的路径
- * @throws IOException
- */
- public void uploadForm(Map<String, String> params, String fileFormName,
- File uploadFile, String newFileName, String urlStr)
- throws IOException {
- if (newFileName == null || newFileName.trim().equals("")) {
- newFileName = uploadFile.getName();
- }
- StringBuilder sb = new StringBuilder();
- /**
- * 普通的表单数据
- */
- for (String key : params.keySet()) {
- sb.append("--" + BOUNDARY + "\r\n");
- sb.append("Content-Disposition: form-data; name=\"" + key + "\""
- + "\r\n");
- sb.append("\r\n");
- sb.append(params.get(key) + "\r\n");
- }
- /**
- * 上传文件的头
- */
- sb.append("--" + BOUNDARY + "\r\n");
- sb.append("Content-Disposition: form-data; name=\"" + fileFormName
- + "\"; filename=\"" + newFileName + "\"" + "\r\n");
- sb.append("Content-Type: image/jpeg" + "\r\n");// 如果服务器端有文件类型的校验,必须明确指定ContentType
- sb.append("\r\n");
- byte[] headerInfo = sb.toString().getBytes("UTF-8");
- byte[] endInfo = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");
- System.out.println(sb.toString());
- URL url = new URL(urlStr);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Content-Type",
- "multipart/form-data; boundary=" + BOUNDARY);
- conn.setRequestProperty("Content-Length", String
- .valueOf(headerInfo.length + uploadFile.length()
- + endInfo.length));
- conn.setDoOutput(true);
- OutputStream out = conn.getOutputStream();
- InputStream in = new FileInputStream(uploadFile);
- out.write(headerInfo);
- byte[] buf = new byte[1024];
- int len;
- while ((len = in.read(buf)) != -1)
- out.write(buf, 0, len);
- out.write(endInfo);
- in.close();
- out.close();
- if (conn.getResponseCode() == 200) {
- System.out.println("上传成功");
- }
- }
下载
private class DownThread extends Thread { @Override public void run() { super.run(); String urlStr = "http://xcmserver.b0.upaiyun.com/v1.0/app/" + apatchName; try { File file = new File(newFilename); if (file.exists()) { urlStr = "http://xcmserver.b0.upaiyun.com/v1.0/app/" + apatchName.replace(".apatch", "new.apatch"); } Log.i("DownLoadPatchThread", "正在下载中" + urlStr); // 构造URL URL url = new URL(urlStr); // 打开连接 URLConnection con = url.openConnection(); if (con != null) { // 输入流 InputStream is = con.getInputStream(); File filePath = new File(commonPath); if (!filePath.exists()) { boolean bool = filePath.mkdirs(); if (bool) Log.e("DownLoadPatchThread", "创建文件夹"); } //如果目标文件已经存在,则删除。产生覆盖旧文件的效果 if (file.exists()) { boolean bool = file.delete(); if (bool) Log.e("DownLoadPatchThread", "删除文件"); } // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 if (!StringUtils.isEmpty(newFilename)) { OutputStream os = new FileOutputStream(newFilename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); } is.close(); Log.i("DownLoadPatchThread", "下载完毕"); File file_out = new File(newFilename); //如果目标文件已经存在,则删除。产生覆盖旧文件的效果 if (file_out.exists()) { if (MyApplication.getInstance().getmPatchManager() != null) { MyApplication.getInstance().getmPatchManager().removeAllPatch(); MyApplication.getInstance().getmPatchManager().addPatch(newFilename); Log.i("DownLoadPatchThread", newFilename + "加载补丁完毕"); } } } } catch (Exception e) { e.printStackTrace(); } }}
断点续传
- public class DownLoadUtil {
- //构造方法略
- public void download(){
- List<FileInfo> lists = threadDAO.get(fileInfo.getUrl());
- FileInfo info = null;
- if(lists.size() == 0){
- //第一次下载,创建子线程下载
- new MyThread(fileInfo).start();
- }else{
- //中间开始的
- info = lists.get(0);
- new MyThread(info).start();
- }
- }
- class MyThread extends Thread{
- private FileInfo info = null;
- public MyThread(FileInfo threadInfo) {
- this.info = threadInfo;
- }
- @Override
- public void run() {
- //向数据库添加线程信息
- if(!threadDAO.isExits(info.getUrl())){
- threadDAO.insert(info);
- }
- HttpURLConnection urlConnection = null;
- RandomAccessFile randomFile =null;
- InputStream inputStream = null;
- try {
- URL url = new URL(info.getUrl());
- urlConnection = (HttpURLConnection) url.openConnection();
- urlConnection.setConnectTimeout(3000);
- urlConnection.setRequestMethod("GET");
- //设置下载位置
- int start = info.getStart() + info.getNow();
- urlConnection.setRequestProperty("Range","bytes=" + start + "-" + info.getLength());
- //设置文件写入位置
- File file = new File(DOWNLOAD_PATH,FILE_NAME);
- randomFile = new RandomAccessFile(file, "rwd");
- randomFile.seek(start);
- //向Activity发广播
- Intent intent = new Intent(ACTION_UPDATE);
- finished += info.getNow();
- if (urlConnection.getResponseCode() == HttpStatus.SC_PARTIAL_CONTENT) {
- //获得文件流
- inputStream = urlConnection.getInputStream();
- byte[] buffer = new byte[512];
- int len = -1;
- long time = System.currentTimeMillis();
- while ((len = inputStream.read(buffer))!= -1){
- //写入文件
- randomFile.write(buffer,0,len);
- //把进度发送给Activity
- finished += len;
- //看时间间隔,时间间隔大于500ms再发
- if(System.currentTimeMillis() - time >500){
- time = System.currentTimeMillis();
- intent.putExtra("now",finished *100 /fileInfo.getLength());
- context.sendBroadcast(intent);
- }
- //判断是否是暂停状态
- if(isPause){
- threadDAO.update(info.getUrl(),finished);
- return; //结束循环
- }
- }
- //删除线程信息
- threadDAO.delete(info.getUrl());
- }
- }catch (Exception e){
- e.printStackTrace();
- }finally {//回收工作略
- }
- }
- }
- }
阅读全文
0 0
- Android流行框架+网络框架
- Android 移动网络框架
- Android网络框架Volley
- Android网络框架Volley
- Android网络框架Volley
- Android网络开发框架
- android 网络框架 volley
- android Volley网络框架
- Android网络框架Volley
- Android-网络框架
- Android网络框架Volley
- Android网络通信框架
- Android 网络框架
- android网络框架
- Android网络框架笔记
- Android网络框架Volley
- Android网络框架Volley
- android网络框架
- 一个广为流传其实问题多多的古典问题
- 无旋Treap
- C++常见面试题(一)——关于字符、字符数组、assert()
- mac 安装QT5.9.1 MYSQL
- 链表常见面试题-C语言实现
- android网络框架
- Oracle的merge into
- Java ==与equals方法有什么区别
- 快速排序
- 管理者的无用功:靠加班、靠团建、靠个人
- netwatch详解,RouterOS-IP检测并执行对应脚本
- plsql中substrb、sbustr的区别
- 数据库锁机制
- 自我救赎之路--java(jar包导入)