Android之HttpURLConnection

幽映每白日,清辉照衣裳。这篇文章主要讲述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项目

Android之HttpURLConnection

文章图片

【Android之HttpURLConnection】效果如图:
Android之HttpURLConnection

文章图片

 
MyTask.java
1 package com.example.threadasynctask; 2 3 import java.io.BufferedReader; 4 import java.io.DataOutputStream; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.net.HttpURLConnection; 9 import java.net.URL; 10 import java.net.URLEncoder; 11 12 import android.os.AsyncTask; 13 import android.util.Log; 14 import android.widget.ProgressBar; 15 import android.widget.TextView; 16 17 /** 18* 生成该类的对象,并调用execute方法之后 19* 首先执行的是onProExecute方法 20* 其次执行doInBackgroup方法 21* @author Administrator 22* 23*/ 24 public class MyTask extends AsyncTask< Integer, Integer, String> { 25 26private TextView textView; 27private ProgressBar progressBar; 28//private String str; 29 30 31private String errorMessage = ""; 32private static final String URL_STR = "http://10.0.2.2:8080/android2016/test.jsp"; 33private String lastId = "love"; 34 35public MyTask(TextView textView, ProgressBar progressBar) { 36super(); 37this.textView = textView; 38this.progressBar = progressBar; 39 40} 41 42/** 43* 这里的Integer参数对应AsyncTask中的第一个参数 44* 这里的String返回值对应AsyncTask的第三个参数 45* 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度 46* 1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务) 47* 2.绝对不能碰UI 48*/ 49@Override 50protected String doInBackground(Integer... params) { 51 52try{ 53//1 、创建一个URL对象 54URL url = new URL(URL_STR); 55//2)利用HttpURLConnection对象从网络中获取网页数据 56HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 57//对连接进行配置 58//conn.setDoOutput(true); 59conn.setDoInput(true); 60conn.setRequestMethod("POST"); 61//防止读取脏数据 62conn.setUseCaches(false); 63 64//3)设置连接超时 65//conn.setConnectTimeout(6*1000); 66 67//获取一个输出流 68OutputStream os = conn.getOutputStream(); 69//可以上传文本数据 70DataOutputStream dos = new DataOutputStream(os); 71dos.writeBytes("id="+URLEncoder.encode(lastId, "UTF-8")); 72//dos.writeBytes("lastId="+lastId); 73dos.flush(); 74dos.close(); 75 76//4)对响应码进行判断 77Log.d("bug", conn.getResponseCode()+""); 78if (conn.getResponseCode() == 200){ 79//从Internet获取网页,发送请求,将网页以流的形式读回来 80 81//5)得到网络返回的输入流 82InputStream is = conn.getInputStream(); 83//reader(注意UTF-8读) 84InputStreamReader isr = new InputStreamReader(is,"UTF-8"); 85//缓冲区,防止读死 86BufferedReader br = new BufferedReader(isr); 87String ReadOneline = null; 88 89//多行数据时,减少不断创建String对象 90StringBuffer sb = new StringBuffer(); 91while ( (ReadOneline=br.readLine())!=null ){ 92sb.append(ReadOneline); 93 94} 95br.close(); 96isr.close(); 97is.close(); 98conn.disconnect(); 99return sb.toString(); 100 101//6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write 102//7)conn.disconnect(); 103}else{ 104errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")"; 105return "errorserver"; 106} 107}catch (Exception e) { 108errorMessage = e.getMessage(); 109return "errorclient"; 110} 111 112 113 114/*int i = 0 ; 115for(i = 0 ; i < = 100 ; i++){ 116str = i+"%"; //模拟加载数据 117try { 118Thread.sleep(100); 119} catch (InterruptedException e) { 120e.printStackTrace(); 121} 122publishProgress(i); 123 124//返回前端 125return i + params[0].intValue() + ""; }*/ 126} 127 128//准备,该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置 129protected void onPreExecute() { 130textView.setText("开始执行异步线程"); 131} 132 133 134//做完后执行 135/** 136*这里的String参数对应AsyncTask中的第三个参数 137*(也就是接收doInBackground的返回值) 138* 在doInBackground方法执行结束之后在运行, 139* 并且运行在UI线程当中 可以对UI空间进行设置 140*/ 141@Override 142protected void onPostExecute(String result) { 143//textView.setText("异步操作执行结束" + result); 144if ("errorclient".equals(result)){ 145if (errorMessage.indexOf("No add")!=-1){ 146textView.setText("网络不通"); 147} 148else{ 149textView.setText("访问网络时其它异常:"+errorMessage); 150} 151 152}else if("errorserver".equals(result)){ 153textView.setText(errorMessage); 154}else{ 155textView.setText(result); 156} 157} 158 159 }

 
注意:因为我是访问电脑的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操作系统中,将本地电脑的地址映射为10.0.2.2;因此,只需要将原先的localhost或者127.0.0.1改成10.0.2.2,就可以在模拟器上访问到tomcat以及部署在tomcat上的资源和服务。  
Android之HttpURLConnection

文章图片
 
地址可以是外部网哦!!
下面给大家展示一下模拟器效果图:
Android之HttpURLConnection

文章图片

 
Android之HttpURLConnection

文章图片

 

    推荐阅读