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 ...
随机推荐
- Android开发-自动更新
为车机写apk,先实现版本的自动更新. 1.不能再主线程中调用会阻塞ui的功能,需要使用异步方式调用网络,引入Android Async Http框架,需要两个包:android-async-http ...
- NSRunLoop详解
1.NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NS ...
- Norflash控制器的Verilog建模之二(仿真)
前言:经过几天修改,norflash控制器基本已经完成,通过仿真.完整的norflash包含2个模块:直接操作硬件的norflash_ctrl.v与控制ctrl模块的驱动norflash_driver ...
- 20条Linux命令面试问答
程序师 http://www.techug.com/20-linux-command-interview-questions 问:1 如何查看当前的Linux服务器的运行级别? 答: ‘who -r ...
- pthread 学习
1. 创建线程 int pthread_create (pthread_t* thread, pthread_attr_t* attr, void* (*start_routine)(void*), ...
- Maven构建项目后项目报Error错误Java compiler level does not match the version of the installed Java project fac
项目->右键->Project Facets->修改facets中Java版本(下拉箭头出)为要用的版本 Maven构建项目需注意 1.项目右键->Preferences-&g ...
- MySQL5.6安装步骤
MySQL5.6安装步骤(windows7/8_64位) 1. 下载MySQL Community Server 5.6.11 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下 ...
- FreeMark学习(二)
(1)用户定义指令 宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏 基本用法 宏是和某个变量关联的模板片断, ...
- c++程序设计之编程思想
代码块愈小,代码的功能就愈容易管理,代码的处理和移动就愈轻松. 任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员. 绝大多数情况下,函数应该放在它所使用的数据的所 ...
- synchronized锁重入
package synLockIn_1; /* synchronized锁重入,当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 * 此例中线程1进入Service类的 ...