Android之HttpURLConnection

Posted 根坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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时会报“找不到网页”的原因。

在Android操作系统中,将本地电脑的地址映射为10.0.2.2;因此,只需要将原先的localhost或者127.0.0.1改成10.0.2.2,就可以在模拟器上访问到tomcat以及部署在tomcat上的资源和服务。
 

 

地址可以是外部网哦!!

下面给大家展示一下模拟器效果图:

  

 

  

 

以上是关于Android之HttpURLConnection的主要内容,如果未能解决你的问题,请参考以下文章

Android探索之HttpURLConnection网络请求

android中的HttpUrlConnection的使用之三

android http通信之HttpURLConnection post乱码问题

android中的HttpUrlConnection的使用之五

android中的HttpUrlConnection的使用之四

Android开发之下载服务器上的一张图片到本地java代码实现HttpURLConnection