Android学习笔记(十五) Http
2024-09-02 13:00:44
1、Http协议概要
- 应用程序和服务间的请求/响应是无状态的,即响应完即断开连接。
- HttpClient库是Android自带的,故无需引入该库
2、Http请求和获取数据
- 生成代表客户端的HttpClient对象
- 生成代表请求的HttpGet对象
- 发送请求,获得服务器端的HttpResponse对象
- 检查响应状态是否正常
- 获取响应对象当中的数据
原则:在主线程当中不能访问网络!
class NeworkThread extents Thread{
@Override
public void run(){
//创建HttpClient
HttpClient httpClient = new DefaultHttpClient();
//创建代表请求的对象,参数是访问的服务器地址
HttpGet httpGet = new HttpGet("http://www.marschen.com/data1.html"); //执行请求,获取服务器发还的响应对象
HttpResponse resp = HttpClient.execute(httpGet); //检查响应状态是否正常,如果等于200则正常
int code = resp.getStatusLine().getStatusCode(); if(code == 200){
//从响应对象中取出数据
HttpEntity entity = resp.getEntity();
InputStream in = entity.gitContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
log.d("HTTP","从服务器取得的数据为"+line);
}
}
}
3、使用Http协议下载文件
这里要分两种情况讨论,因为下载文档可以用更简单的方法实现,而且很多文档是需要按行读取的。
3.1 下载文档
- 创建一个URL对象
- 通过URL对象,创建一个HttpURLConnection对象
- 得到InputStream
- 从InputStream当中读数据
public String download(String urlStr){
StringBuffer sb = new StringBuffer();
//A string buffer is like a String,but can be modified.
//but the length and content of the sequence can be changed through certain method calls(append,reverse,insert,charAt....). String line = null;
BufferedReader bf = null; try {
//创建一个URL对象
url = new URL(urlStr); //创建一个Http连接
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); //使用BufferedReader来读数据
bf = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
while ((line = bf.readLine()) != null){
sb.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
3.2 下载文件
为了实现起来更简单,而且考虑到以后会经常用,所以先把关于文件与SD卡相关的一些操作封装到一个FileUtils类里。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import android.os.Environment; public class FileUtils {
private String SDPATH; public FileUtils(){
//得到当前外部存储设备的目录
SDPATH = Environment.getExternalStorageDirectory()+"/";
} /*
* 在SD卡上创建文件
*/
public File createSDFile(String fileName) throws IOException{
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
} /*
* 在SD卡上创建目录
*/
public File createSDDir(String dirName){
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
} /*
* 判断文件是否存在
*/
boolean isFileExist(String fileName){
File file = new File(fileName);
return file.exists();
} /*
* 将InputStream中的文件写入到SD卡中
*/
public File writeIntoSDFromInput(String path,String fileName,InputStream inputStream){
File file = null;
OutputStream os = null; try {
file = createSDFile(path + fileName);
os = new FileOutputStream(file);
byte [] buffer = new byte[1024*4];
while((inputStream.read(buffer)) != -1){
os.write(buffer);
}
os.flush();//刷新缓冲,将缓冲区中的数据全部取出来
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
inputStream.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
} }
return file;
}
}
然后是具体实现方法。其实有将url转化成为InputStream的方法和下载文档是相同的,所以同样是为了以后使用方便,将其写成一个方法。区别是在得到InputStream对象后的不同处理方法。
/*
* 返回-1:代表下载文件出错;返回0,:代表下载文件成功;返回1:代表文件已经存在
*/
public int downloadFile(String urlStr,String path,String fileName){
InputStream inputStream = null;
FileUtils fileUtils = new FileUtils(); if(fileUtils.isFileExist(path + fileName)){
return 1;
}
else{
inputStream = urlStrToInputStream(urlStr);
File resultFile = fileUtils.writeIntoSDFromInput(path, fileName, inputStream);
if(resultFile == null){
return -1;
}
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
} //将字符串类型的url转化成为InputStream。读取数据通过InputStream实现。
public InputStream urlStrToInputStream(String urlStr){
URL url = null;
InputStream inputStream = null;
try {
url = new URL(urlStr);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
inputStream = urlConnection.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
最新文章
- layout_weight详解
- C加密解密
- javascript权威指南(2)
- Channel Allocation(DFS)
- postgresql 导出函数的方法
- Appium基于Python unittest自动化测试 &; 自动化测试框架 -- PO并生成html测试报告
- [PA 2014]Kuglarz
- springboot~环境搭建与Helloworld
- Linux 文本去重 之 命令sort 与 uniq
- Qt5+MSVC2015编译器编译发布的Release程序运行崩溃,如何查找崩溃的原因??
- RabbitMQ基本示例,轮询机制,no_ack作用
- windows下使用electron+sqlite3
- 分类统计的controller和service
- Python—内置函数
- [leetcode]1. Two Sum两数之和
- Spring boot 配置 log4j2.xml
- Python3科学计算库概况
- Mac 下 SVN 的使用
- 成都Uber优步司机奖励政策(4月6日)
- Codeforces Round #344 (Div. 2) A. Interview 水题
热门文章
- brctl和虚拟网桥
- u-boot支持LCD显示(基于TQ2440)【转】
- JS处理空格
- 如何在Android studio中同时打开多个工程?
- Java 内存管理、JVM 工作原理与 Java 运行时系统
- I.MX6 RGB clock 和 data 重合
- HDU4704:Sum(欧拉降幂公式)
- [noip模拟赛]午餐
- c++性能测试工具:google benchmark入门(二)
- 《StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation》论文笔记