• 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上的资源和服务。
     

    地址可以是外部网哦!!

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

      

      

  • 相关阅读:
    基于Redis主从复制读写分离架构的Session共享(Windows Server)
    第3章 线性表
    第2章 算法
    python中统计计数的几种方法和Counter的介绍
    Linux关于文件的权限笔记
    线程同步与互斥(线程安全)
    Python csv模块的使用
    Python 源码分析:queue 队列模块
    Java锁,真的有这么复杂吗?
    1537 学生干部虚基类
  • 原文地址:https://www.cnblogs.com/lgk1002/p/6143019.html
Copyright © 2020-2023  润新知