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