Android之Web通信的使用

一、了解Android网络基础

  1、Android平台有三种网络接口可以使用

    a、标准Java接口 java.net.*

    b、Apache接口 org.apache.*(开源项目HttpClient)

    c、Android网络接口 android.net.*

二、掌握Android应用的HTTP通信

  1、HTTP:超文本传输协议(Hyper Text Transfer Protocol)

  2、采用请求/响应模式

  3、Android提供了HttpURLConnection和HttpClient接口

三、HttpURLConnection接口

  1、HttpURLConnection是Java的标准类,继承自URLConnection类。他们都是抽象类无法实例化对象。

  a、主要是通过URL的openConnection方法获得创建连接,代码如下:

URL ur l= new URL(“http://www.google.com”);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

  b、默认使用Get方式,这需要通过url传递参数即可

URL url=new URL("http:www.google.com?parameter=bruce");
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();

  c、使用Post方式,则需要setRequestMethod设置

// 设置以POST方式
urlConn.setRequestMethod("POST");

//设置连接超时时间,单位:毫秒
urlConn.setConnectTimeout(10*1000);
//设置读取超时时间,单位:毫秒
urlConn.setReadTimeout(15*1000);
//设置是否允许接收服务器端响应内容,默认true
urlConn.setDoInput(true);
//设置是否允许构建一个输出流向服务器传递数据,默认false
urlConn.setDoOutput(true);
//设置是否使用缓存,POST不能使用缓存
urlConn.useCache(false);
//建立连接
urlConn.connect();

  d、获取网络图片,只需要将得到的数据流转换成bitmap就可以了

//创建HttpURLConnection
HttpURLConnection conn=(HttpURLConnection)iamgeUrl.openConnection();//设置是否允许接收服务器端响应内容(默认为true)
conn.setDoInput(true);//建立连接
conn.connect();
//构建输入流
InputStream stream=conn.getInputStream();//将数据流转换成Bitmap
bitmap=BitmapFactory.decodeStream(stream);//关闭流
is.close();

四、HttpClient

一、Apache提供的HttpClient也适合我们在Android上开发互联网应用

    1、ClientConnectionManager接口

      a、客户端连接管理的接口

    2、DefaultHttpClient

      a、默认的HTTP客户端,可以使用创建HTTP连接

    3、HttpResponse

      a、一个Http连接响应,通过它可以得到返回的响应消息

  二、实现步骤

    1、使用HttpClient需要以下五个步骤;

      a、使用DefaultHttpClient实例化HttpClient对象。

      b、创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

      c、调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

      d、通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

      e、释放连接。无论执行方法是否成功,都必须释放连接。  

    2、使用Get方式提交请求

//HttpGet连接对象
HttpGet httpRequest = new HttpGet(httpUrl);
//取得HttpClient对象
HttpClient httpclient = new DefaultHttpClient();
//请求HttpClient,取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);

    3、根据响应的代码判断请求是否成功

//请求成功
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){

}

    4、代码(GET)

//构建HttpClient的实例
DefaultHttpClient httpClient=new DefaultHttpClient();
//创建Get实例
HttpGet get=new HttpGet("http://www.baidu.com");
try{
    //发送请求并得到响应结果
    HttpResponse res=httpClient.execute(get);
    //处理响应结果数据
    if(res != null && res.getStatusLine().getStatusCode() == HttpStaatus.SC_OK){
          System.out.println(EntityUtils.toString(res.getEmtity()));
    }
}catch(Exception ex){
      ex.printStackTrace();
}finally{
      //释放资源
      httpClient.getConnectionManager().shutdown();
}    

    5、使用Post方式提交请求

//HttpPost连接对象
HttpPost HTTPRequest=new HttpPost(httpUrl);

    6、使用NameValuePair来保存要传递的参数

//使用NameValuePair来保存要传递的Post参数
List<NameValuePair>params=new ArrayList<NameValuePair>();
//添加要传递的参数
params.add(new BasicNameValuePair("pair","HttpClient_android_Post"));

    7、同样是通过HTTP客户端提交请求

//设置字符集
HTTPEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");
//请求httpRequest
HttpRequest.setEntity(httpentity);

//取得默认的HttpClient
HttpClient httpclient=new DefaultHttpClient();
//提交请求
httpclient.execute(httpRequest);

    8、代码POST

//构建HttpClient实例
DefaultHttpClient httpClient = new DefaultHttpClient();
//创建Post实例
HttpPost post = new HttpPost("http://www.baidu.com")
//初始化请求参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("stuNo","123456"));
params.add(new BasicNameValuePair("stuName","zhangsan"));
params.add(new BasicNameValuePair("stuSex","男"));
params.add(new BasicNameValuePair("stuTemp","1997-1-1"));
params.add(new BasicNameValuePair("stuAddress","zhuhai"));
try{
     //设置请求参数,并以UTF-8方式编码
     post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
     //发送请求并得到响应结果
     HttpResponse res=httpClient.execute(post);
     //处理响应结果数据
     if(res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
           System.out.println(EntityUtils.toString(res.getEntity()));
     }
}catch(Exception ex){
      ex.printStackTrace();
}finally{
      //释放资源
      httpClient.getConnectionManager().shutdown();
}

    9、实时更新可以在客户端通过线程不听的请求并刷新页面

    10、不能直接在线程中更新UI,需要使用Handler来实现,代码如下:

Handler mHandler=new Handler(){
  public void handleMessage(Message msg){
      super.handleMessage(msg);
      //刷新
      refresh();
  }
}
时间: 2024-10-12 21:17:54

Android之Web通信的使用的相关文章

使用 PHP 消息队列实现 Android 与 Web 通信

需求描述很简单:Android 发送数据到 Web 网页上. 系统: Ubuntu 14.04 + apache2 + php5 + Android 4.4 思路是 socket + 消息队列 + 服务器发送事件,下面的讲解步骤为 Android 端,服务器端,前端.重点是在于 PHP 进程间通信. Android 端比较直接,就是一个 socket 程序.需要注意的是,如果直接在活动主线程里面创建 socket 会报一个 android.os.NetworkOnMainThreadExcept

Android -- 与WEB交互在同一个会话Session中通信

Session与Cookie Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实现,也可以用URL回写的机制来实现. Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端,Session将状态保存在服务器端: 2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.网络服务器用HTTP头向客户端发送cookies,在客户

Android平台调用Web Service:引入线程

接上文 遗留问题 MainActivity的onCreate方法中如果没有有这段代码: // 强制在UI线程中操作 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Bu

Android之Http通信——1.初识Http协议

Android之Http通信--1.初识Http协议 引言: 今天是六一儿童节,先在这里给各位超龄儿童说声节日快乐哈~( ╯□╰ ),小猪也象征性地给群里的小朋友们派了红包-嗯,忙碌的五月最终过去了,做毕设,写论文,拍毕业照,答辩,辞职.各种各样的事,也算忙完了,好吧.小猪如今又在一家新的公司上班了.第三间公司了.你们肯定会认为小猪三心二意是吧,毕竟才差点儿相同毕业就换了那么多家公司,然后可能问我."小猪你什么时候跳第四间公司",哈哈,应该不会了哈,怎么说呢,事实上我还是非常专一的,毕

Android之Http通信——2.详解Http的消息头与响应头

Android之Http通信--2.详解Http的消息头 --转载请注明出处:coder-pig,请勿用于商业用途~ 本节引言: 在上一节中我们对HTTP的一些概念性的东西进行了了解:什么是HTTP协议,1.0版本与1.1版本的区别, SYN和ACK,TCP/IP三次握手,HTTP操作流程,几种不同的请求方式,HTTP的状态吗, 以及HTTP协议的特点,最后还了解了下OSI七层协议与TCP四层模型,相信大家对HTTP已经有了 简单的了解,本节我们来扣HTTP的消息头以及响应头,好了,开始本节内容

Android NFC近场通信03----读写MifareClassic卡

                                       Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(sector),每个分区4个块(block),每个块(block) 16个byte数据 2K: 32个分区,每个分区4个块(block),每个块(block) 16个byte数据 4K:64个分区,每个分区4个块(

Android开发——web浏览器开发(1) 版本1.0

1,建立一个新的项目 webdemo 2,layout下activity_main设计界面(1)待优化 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layo

Android平台调用Web Service:线程返回值

接上文 前文中的遗留问题 对于Java多线程的理解,我以前仅仅局限于实现Runnable接口或者继承Thread类,然后重写run()方法,最后start()调用就算完事,但是一旦涉及死锁以及对共享资源的访问和随时监控线程的状态和执行顺序和线程返回值等就不行了. Callable 和 Future 简介 Callable接口代表一段可以调用并返回结果的代码;Future接口表示是执行异步任务时的状态.返回值等信息.所以说Callable用于产生结果,Future用于获取结果. 1. Callab

Android NFC近场通信02----读写卡的准备工作

                    Android NFC近场通信02----读写卡的准备工作      由于公司接了一个听上去感觉比较NB的项目,给某油田做派工系统 .并由小女子负责Android客户端的开发工作~~开发时的Android设备看上去是比较高大上哈,防爆的,其实很多次同事们都想开玩笑的说试试摔地上,都防爆嘛,那肯定摔不坏的哈~~开发过程中需要用到NFC技术,所以就在网上学习并整理了一下关于Android nfc相关的知识~好了,切入主题,本文写读写卡前的准备工作: ps:这一