Android之HttpURLConnection
1.HttpURLConnection连接URL
1)创建一个URL对象
URL url = new URL();
2)利用HttpURLConnection对象从网络中获取网页数据
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3)设置连接超时
conn.setConnectTimeout(6*1000);
4)对响应码进行判断
if (conn.getResponseCode() == 200){ //从Internet获取网页,发送请求,将网页以流的形式读回来
//返回网页取出的数据
}else{
throw new RuntimeException("请求url失败");
}
5)得到网络返回的输入流
InputStream is = conn.getInputStream();
6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
7)conn.disconnect();
总结:
--记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
--返回的响应码200,是成功.
--在Android中对文件流的操作和JAVA SE上面是一样的.
--在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
--操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
--对文件流操作完,要记得及时关闭.
下面是根据前天的案例改写的:
前期准备一个web项目
效果如图:
MyTask.java
package com.example.threadasynctask; import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder; import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView; /**
* 生成该类的对象,并调用execute方法之后
* 首先执行的是onProExecute方法
* 其次执行doInBackgroup方法
* @author Administrator
*
*/
public class MyTask extends AsyncTask<Integer, Integer, String>{ private TextView textView;
private ProgressBar progressBar;
//private String str; private String errorMessage = "";
private static final String URL_STR = "http://10.0.2.2:8080/android2016/test.jsp";
private String lastId = "love"; public MyTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar; } /**
* 这里的Integer参数对应AsyncTask中的第一个参数
* 这里的String返回值对应AsyncTask的第三个参数
* 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度
* 1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务)
* 2.绝对不能碰UI
*/
@Override
protected String doInBackground(Integer... params) { try{
//1 、创建一个URL对象
URL url = new URL(URL_STR);
//2)利用HttpURLConnection对象从网络中获取网页数据
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//对连接进行配置
//conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
//防止读取脏数据
conn.setUseCaches(false); //3)设置连接超时
//conn.setConnectTimeout(6*1000); //获取一个输出流
OutputStream os = conn.getOutputStream();
//可以上传文本数据
DataOutputStream dos = new DataOutputStream(os);
dos.writeBytes("id="+URLEncoder.encode(lastId, "UTF-8"));
//dos.writeBytes("lastId="+lastId);
dos.flush();
dos.close(); //4)对响应码进行判断
Log.d("bug", conn.getResponseCode()+"");
if (conn.getResponseCode() == 200){
//从Internet获取网页,发送请求,将网页以流的形式读回来 //5)得到网络返回的输入流
InputStream is = conn.getInputStream();
//reader(注意UTF-8读)
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null; //多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ( (ReadOneline=br.readLine())!=null ){
sb.append(ReadOneline); }
br.close();
isr.close();
is.close();
conn.disconnect();
return sb.toString(); //6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
//7)conn.disconnect();
}else{
errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")";
return "errorserver";
}
}catch (Exception e) {
errorMessage = e.getMessage();
return "errorclient";
} /*int i = 0 ;
for(i = 0 ; i <= 100 ; i++){
str = i+"%"; //模拟加载数据
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i); //返回前端
return i + params[0].intValue() + ""; }*/
} //准备,该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
protected void onPreExecute() {
textView.setText("开始执行异步线程");
} //做完后执行
/**
* 这里的String参数对应AsyncTask中的第三个参数
* (也就是接收doInBackground的返回值)
* 在doInBackground方法执行结束之后在运行,
* 并且运行在UI线程当中 可以对UI空间进行设置
*/
@Override
protected void onPostExecute(String result) {
//textView.setText("异步操作执行结束" + result);
if ("errorclient".equals(result)){
if (errorMessage.indexOf("No add")!=-1){
textView.setText("网络不通");
}
else{
textView.setText("访问网络时其它异常:"+errorMessage);
} }else if("errorserver".equals(result)){
textView.setText(errorMessage);
}else{
textView.setText(result);
}
} }
注意:因为我是访问电脑的Tomcat服务器,在web端时可以用http://localhost:8080/android2016/test.jsp?id=1访问到网页,但是
在J2ee应用开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务。
如果在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到tomcat上部署的服务。
可想而知:Android底层是Linux内核,Android本身就是一个操作系统;
因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是 Android模拟器(Android虚拟机),
而并非不是你的电脑。这也是你在模拟器中使用localhost时会报“找不到网页”的原因。
地址可以是外部网哦!!
下面给大家展示一下模拟器效果图:
Android之HttpURLConnection的更多相关文章
- android之HttpURLConnection(转)
android之HttpURLConnection 1.HttpURLConnection连接URL1)创建一个URL对象 URL url = new URL(http://www.baidu.com ...
- Android HttpClient HttpURLConnection相关介绍
Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...
- android 之HttpURLConnection的post,get方式请求数据
get方式和post方式的区别: 1.请求的URL地址不同: post:"http://xx:8081//servlet/LoginServlet" get:http://xxx: ...
- Android使用HttpURLConnection通过POST方式发送java序列化对象
使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...
- Android利用HttpURLConnection实现模拟登录
最近在做一个APP,需要模拟登录教务处,之前曾经用HttpClient做过,点这里,但是发现最新的Android SDK已经不支持Httpclient了,所以只好在琢磨一下HttpURLConnect ...
- android 使用HttpURLConnection方式提交get/post请求
源码链接 package com.zhangbz.submitdata.Utils; import java.io.ByteArrayOutputStream; import java.io.IOEx ...
- 转-Android联网 — HttpURLConnection和HttpClient选择哪个好?
http://www.ituring.com.cn/article/199619?utm_source=tuicool 在Android开发中,访问网络我们是选择HttpURLConnection还是 ...
- Android使用HttpURLConnection下载图片
讲到http就必须要了解URI和URL URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符 ...
- Android中HttpURLConnection对象是怎么生成的
try { URL mUrl = new URL("https://www.jianshu.com/"); HttpURLConnection http = (HttpURLCon ...
随机推荐
- find命令和tar命令的使用
tar命令 tar -zcvf small.tar.gz small(目录名) (压缩) tar -zxvf small.tar.gz -C small(目录名) (解压到指定目录) find 命令 ...
- Shell中取得文件的最后修改时间
stat -c %y file 取得修改日期 -,-,-
- 简单的java socket 示例
一.搭建服务器端 a).创建ServerSocket对象绑定监听端口. b).通过accept()方法监听客户端的请求. c).建立连接后,通过输入输出流读取客户端发送的请求信息. d).通过输出流向 ...
- 【原创】安装LoadRunner12.53 版本时出现Critical error的解决方法
步骤: 1.在官网上下载LoadRunner12.53正版,只不过要注册,然后官网会给个序列号. 2.安装成功之后,快捷键已创建,打开Virtual User Generator时,提示如下错误: 此 ...
- 把解压缩版的tomcat6注册成服务并设置自启动
操作步骤: 1.在“开始 ”→“运行 ”中输入cmd 命令,进入MS-DOS界面 2.cd 到tomcat的bin目录下 C:/> cd tomcat/bin 3.运行命令servi ...
- SQL SERVER中求上月、本月和下月的第一天和最后一天 DATEADD DATEDIFF
SQL SERVER中求上月.本月和下月的第一天和最后一天 1.上月的第一天 SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GE ...
- dll 劫持
库: AheadLib 输入dll 处填你要劫持的dll 路径. 例如: C:\WINDOWS\system32\lpk.dll 来自为知笔记(Wiz)
- JAVA EE中session的理解
转自[互动百科]http://www.baike.com/wiki/Session Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...
- MSSQL sp_helptextplus
默认的sp_helptext 如果存储过程每行代码太长会自动截断 把这个sp_helptextplus添加到SSMS的keyboard快捷键里面 SET QUOTED_IDENTIFIER ON SE ...
- RDD:基于内存的集群计算容错抽象(转)
原文:http://shiyanjun.cn/archives/744.html 该论文来自Berkeley实验室,英文标题为:Resilient Distributed Datasets: A Fa ...