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 ...
随机推荐
- ajaxpro返回值类型总结-DataTable(转)
ajaxpro使用总结系列其他内容 ajaxpro ajaxmethod 重载调用问题 ajaxpro方法ajaxmethod调用示例 ajaxpro返回值类型总结-string,int ajaxpr ...
- WebStorm 10.0.4注册码
WebStorm 是JetBrains旗下的一款轻量级JavaScript 开发工具,软件的功能非常强大,具备复杂客户端和服务器端的开发能力,被广大中国JS开发者誉为“Web前端开发神器”.“最强大的 ...
- Eclipse导入Tomcat源码(转)
想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...
- 关于jq+devexpress基础知识总结(随便的基础)
//获取某行某列的值 onSelectionChanged: function (selectedItems) { ]; if (data != null) postionno = data.POST ...
- python模块之subprocess
可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 commands.* ...
- js数组的操作
很早之前整理的一篇文章,感觉比较清晰. 一.数组元素的操作 1.数组的创建 var arrayObj = new Array(); var arrayObj = new Array(size); // ...
- 使用archlinux作为日常开发机已经半年了,随便写一下
机器配置 CPU: Intel Core i5-6200U CPU @ 2.8GHz RAM: 6114MiB / 7421MiB Resolution: 1920x2160 在arch下常用的软件 ...
- wampserver配置域名
装载自http://blog.csdn.net/znb26/article/details/51204313
- 阅读Python官方文档心得
我会每天都阅读一些python的官方文档,并每天更新心得体会. -------------------------------------------------2016.12.08--------- ...
- ArcGIS api fo silverlight学习二(silverlight加载GraphicsLayer)
上一节学习了silverlight加载GeoServer发布的WMS地图,这一节学习一下加载GraphicsLayer 一.加载.png或jpg文件图标 1.在MainPage.xaml中添加资源配置 ...