Android学习笔记(十五) Http
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;
}
Android学习笔记(十五) Http的更多相关文章
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】Pro Android学习笔记(五):了解Content Provider(上)
Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider ...
- 【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条
目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable ...
- Android学习笔记(五)——活动的生命周期
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 为了能写出流畅连贯的程序,我们需要了解一下活动的生命周期. 一.返回栈 Android 中的活动是可以层叠的. ...
- (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
- (C/C++学习笔记) 十五. 构造数据类型
十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...
- 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference
目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...
随机推荐
- Entity Framework工具POCO Code First Generator的使用(参考链接:https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generator)
在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一 ...
- mp3 pcm
mp3 pcm javaMP3转pcm 百度语音识别 - 且学且珍惜 - SegmentFault 思否 https://segmentfault.com/a/1190000013383967
- Deep Learning 30: 卷积理解
一.深度卷积神经网络学习笔记(一): 1. 这篇文章以贾清扬的ppt说明了卷积的实质,更说明了卷积输出图像大小应该为: 假设输入图像尺寸为W,卷积核尺寸为F,步幅(stride)为S(卷积核移动的步幅 ...
- UESTC149 解救小Q
小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头.现在请你 ...
- adbi命令【转】
本文转载自:https://zmywly8866.github.io/2015/01/24/all-adb-command.html ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列 ...
- YTU 1011: Rails
1011: Rails 时间限制: 1000 Sec 内存限制: 64 MB 提交: 16 解决: 9 题目描述 There is a famous railway station in PopP ...
- 如何正确使用log4j
如何正确使用log4j? 关键字: 如何正确使用log4j? Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态.最简单的输出l ...
- 深入分析glibc内存释放时的死锁bug
通常我们认为一旦内存写溢出,程序就很容易崩溃.所以服务器上通常会对一些重要进程做脚本保护,一旦崩溃立即重新拉起. 最近发现我们一个公共服务内存写溢出时程序没有崩溃,而是卡死了. 为了深入分析原因,我们 ...
- Center OS Tomcat7 服务器配置总结
tomcat7 目录结构 --- webapps 应用存放目录,可以配置Host 来决定这个文件的目录,可以配置多个Host,多个webapps ---ROOT 项目根目录,Tomcat会特殊对待这个 ...
- 《The Unreasonable Effectiveness of Recurrent Neural Networks》阅读笔记
李飞飞徒弟Karpathy的著名博文The Unreasonable Effectiveness of Recurrent Neural Networks阐述了RNN(LSTM)的各种magic之处, ...