Android下的联网下载的操作
一:从网络下载图片
MainActivity:
NetService
1.由路径获取Url
2.使用url打开HttpURLConnection连接
3.根据路径查找本地sd卡是否有缓存文件,如果文件存在,发送最后修改时间
File file = new File("/mnt/sdcard/" + URLEncoder.encode(path, "UTF-8"));
conn.setIfModifiedSince(file.lastModified());
4.得到响应返回码,如果返回码是200,则正确得到网络连接
5.由连接获取输入流,将输入流写入到内存,由于是图片,所以为byte,
6.将内存中的数据赋给byte数组data,
7.用Bitmap的解码工厂将数据解码为图片
Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);
8,为了以后省流量,快速访问,将此图片缓存到本地
二:登录:
classicLogin:
点击登录时开始新线程
1.获得用户名与密码
2.调用服务层的方法为用户名与密码设置编码:
Service.post(username,password)
3.若无异常提示成功,否则提示失败
服务层的方法:
1.设置处理用户名与密码的Servlet路径:
private String path = "http://192.168.1.100:8080/05.Web/LoginServlet"
1.post方法:
1.Creates a new URL instance by parsing spec.
URL url = new URL(path);
2.获取HttpURLConnection连接
3.设置连接超时时间
4.设置请求方法为post
5.设置三个请求头
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", params.getBytes().length + "");
conn.setRequestProperty("Host", "192.168.1.100:8080");
6.Sets the flag indicating whether this URLConnection allows output
conn.setDoOutput(ture);
7.将得到的用户名密码编码后输出
username = URLEncoder.encode(username,"utf-8")
conn.getOutputStream().write(username.getBytes());
8.得到响应码,若响应码不是200,则抛出异常。
3.get方式:
1.get方式是:http://192.168.1.100:8080/05.Web/LoginServlet?username=xxx&password=xxx
所以在创建URL时应遵照这种格式:
String path = "http://192.168.1.100:8080/05.Web/LoginServlet";
String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");
URL url = new URL(path + "?" + params);
2.打开HttpURLConnection连接
3.设置连接超时时间
4.设置请求方法
5.开始连接,得到返回码
6.根据返回码判断网络状态
4.牛逼的方式:
常见的麻烦的方法已经有人写好了,自己可以直接拿来调用:
1.在MainActivity中
private AsyncHttpClient client = new AsyncHttpClient();
2.在点击登录时调用client的post或get方法即可:
client.post(url, params, responseHandler)
client.get(url, params, responseHandler)
三:上传:
上传这种常见的麻烦的方法也被同一个牛逼人物写好了,同上,直接调用
类似的,把将要上传的文件也放入params中:
RequestParams params = new RequestParams();
params.put("username", username);
params.put("password", password);
params.put("upload", new File(upload));
client.post(url, params, new AsyncHttpResponseHandler();
四:下载
1.java中最简单的下载
1.找到文件所在的路径:
URL url = new URL(“http:xxxx/xx.txt”);
2.打开http连接
3.设置连接超时时间
4.设置请求方式
5.开始连接得到响应码
6.响应码正确(200)则将由连接得到的输入流中的数据写入到本地
2.多线程下载:
一:DownloadTask:继承Thread,规定线程数THREAD_AMOUNT = 3;
1.在DownloadTask的构造函数中传入下载地址,从下载地址中截取文件名
2.run方法
a) :打开连接,设置超时时间
b) :获取文件长度 :conn.getConntentLength();
c) :计算每个线程要下载的长度
d) :开启所有线程,每个线程会下载一部分数据到本地文件中
New DownloadThread(i).start();
二:内部类DownloadThread:继承Thread,构造函数中传递的参数用来标记下载任务中的线程
1.run方法:
a) :设置当前线程要下载的起始位置,结束位置
b) :当前线程打开Http连接,设置超时时间,设置请求下载的范围
c) :用随机读写文件地文件读写,此时同单线程下载操作
3.多线程断点续传:
在多线程的基础上修改:添加一个临时文件记录当前线程下载到了哪一个字节了,然后下次再启动时,直接从当前临时文件所记录的地方接着下载.
一:在BPDownloadTask中的修改
a) :在BPDownloadTask的构造函数中创建临时文件.
b) :在run方法启动时,要判断临时文件是否存在,若不存在,则写入每个线程的开始位置
c) :开启线程,每个线程会下载一部分数据到本地文件中
二:在内部类DownloadThread中的修改
A):在run方法中创建记录进度的临时文件.
RandomAccessFile tempRaf = new RandomAccessFile(tempFile, "rws");
B):根据当前线程的id将指针移动到当前线程的位置读取当前线程已完成的数据
tempRaf.seek(id * 4);
C):多个下载进程之间同步,统计所有线程总共完成了多少
synchronized(BPDownloadTask.this) {
totalFinish += threadFinish;
}
D):计算当前线程起始位置,结束位置,后续同多线程下载.
Android下的联网下载的操作的更多相关文章
- 在Android下通过ExifInterface类操作图片的Exif信息
什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- ubuntu14.04下 Android虚拟机 genymotion 的下载和安装
官网:https://www.genymotion.com/ Install Guide https://www.genymotion.com/#!/developers/user-guide#ins ...
- android下获取无线wif信号、ssid、MAC等操作类
一个android下获取无线wif信号.ssid.MAC等操作的类. WifiAdmin.java package com.afu; import java.util.List; import and ...
- Android下数据库操作——增删改查
Android下数据库第一种方式增删改查 1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象 2.使用SqliteDat ...
- Android下OpenCV的环境搭建
目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...
- Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境
Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境 !!OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用Ope ...
- Android下的Linux指令集
Android目录结构 data app:用户安装的应用 data:应用的专属文件夹 system:系统的配置信息,注册表文件 anr:anr异常的记录信息 dev:devices的缩写 存放设备所对 ...
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
随机推荐
- 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)
目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...
- Linux文件压缩、打包、备份
1:Linux常见的压缩文件 2:gzip压缩指令 3:bzip2压缩指令(比gzip更高压缩比) 同理,可以用bzcat\bzmore\bzless读取被压缩后文件内容. 4:xz压缩指令(比bzi ...
- Android学习笔记十:异步处理
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7520700.html 一:基础概念 UI线程:当Android程序第一次启动时,Android会同时启动一条主 ...
- CentOS静默安装Oracle 11gR2(x64)
环境 OS: CentOS 7.4; hosts: L134; IP: 192.168.1.134 DB: linux.x64_11gR2_database 安装依赖包 yum install -y ...
- 关于XCode更换项目名称
1.打开项目直接修改项目名称 2.直接修改分组名 3.然后.command+B会报错 4.找到项目源文件 YourProject.xcodeproj - > 右键显示包内容->找到pro ...
- iOS下Symbol not found: ___sincosf_stret错误
在调试一个带第三方库的多媒体应用中,发如今iOS6.1.2的版本号上必定crash.显示Symbol not found: ___sincosf_stret错误,这个错误非常少见. watermark ...
- iOSUIWebView---快停下啦,你的愚蠢的行为
公元前 之前还是学生时代的时候给社团们学弟学妹们介绍iOS编程的时候,简单的准备了图灵ios培训第一周(使用UIWebView创建简易浏览器), NSURL *url =[NSURL URLWithS ...
- 【PMP】资源平衡与资源平滑
资源平衡:为了在资源需求与资源供给之间取得平衡,根据资源制约因素对开始日期和完成日期进行调整的一种技术 资源平滑:对进度模型中的活动进行调整,从而使项目资源需求不超过预定的资源限制的一种技术. 案例说 ...
- SpringBoot常用属性配置
SpringBoot 2.x:https://github.com/spring-projects/spring-boot/blob/2.0.x/spring-boot-project/spring- ...
- Iphone开发基本UI组件
在IOS中的基础UI组件,IPHONE的组件大多以UI开头,这种独树一帜的命名方法极有可能是为了与其他系统的组件进行区分,避免混淆引起冲突: 下面描述一下IOS的基础UI控件以及和Android中的 ...