一、WebView 的用法

Android 提供WebView 的用法,可以在自己的应用程序里嵌入一个浏览器

  1. webView.getSettings().setJavaScriptEnabled(true);
  2. webView.setWebViewClient(new WebViewClient() {
  3. @Override
  4. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  5. view.loadUrl(url); // 根据传入的参数再去加载新的网页
  6. return true; // 表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器
  7. }
  8. });
  9. webView.loadUrl("http://www.baidu.com");

声明权限

<uses-permission android:name="android.permission.INTERNET" />

二、 HTTP 协议访问网络

(1)使用 HttpURLConnection

获取到 HttpURLConnection 的实例

  1. URL url = new URL("http://www.baidu.com");
  2. HttpURLConnection connection = (HttpURLConnection) url.openConnection();

设置一下 HTTP 请求所使用的方法

connection.setRequestMethod("GET");

置连接超时、读取超时的毫秒数

  1. connection.setConnectTimeout(8000);
  2. connection.setReadTimeout(8000);

InputStream in = connection.getInputStream();

  1. InputStream in = connection.getInputStream();

最后可以调用 disconnect()方法将这个 HTTP 连接关闭掉

  1. connection.disconnect();

POST方法可以这样写

  1. connection.setRequestMethod("POST");
  2. DataOutputStream out = new DataOutputStream(connection.getOutputStream());
  3. out.writeBytes("username=admin&password=123456");

(2) HttpClient

HttpClient 是一个接口,因此无法创建它的实例,通常情况下都会创建一个 DefaultHttpClient 的实例

  1. HttpClient httpClient = new DefaultHttpClient();

创建一个 HttpGet 对象,并传入目标的网络地址,然后调用 HttpClient 的 execute()方法

  1. HttpGet httpGet = new HttpGet("http://www.baidu.com");
  2. httpClient.execute(httpGet);

发起POST请求

  1. HttpPost httpPost = new HttpPost("http://www.baidu.com");

通过一个 NameValuePair 集合来存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity中,

然后调用 HttpPost的 setEntity()方法将构建好的 UrlEncodedFormEntity传入

  1. List<NameValuePair> params = new ArrayList<NameValuePair>();
  2. params.add(new BasicNameValuePair("username", "admin"));
  3. params.add(new BasicNameValuePair("password", "123456"));
  4. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
  5. httpPost.setEntity(entity);
  6. httpClient.execute(httpPost);

执行 execute()方法之后会返回一个 HttpResponse对象, 服务器所返回的所有信息就会包含在这里面

  1. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  2. // 请求和响应都成功了
  3. }

if 判断的内部取出服务返回的具体内容,可以调用 getEntity()方法获取到一个 HttpEntity 实例,

然后再用 EntityUtils.toString()这个静态方法将 HttpEntity 转换成字符串

  1. HttpEntity entity = httpResponse.getEntity();
  2. String response = EntityUtils.toString(entity, "utf-8");

三、解析XML

(1)Pull解析

  1. protected void parseXMLWithPull(String response) {
  2. // TODO Auto-generated method stub
  3. try {
  4. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  5. XmlPullParser xmlPullParser = factory.newPullParser();
  6. xmlPullParser.setInput(new StringReader(response));
  7. int eventType = xmlPullParser.getEventType();
  8. String id = "";
  9. String name = "";
  10. String version = "";
  11. //开始某个节点的解析
  12. while (eventType != XmlPullParser.END_DOCUMENT) {
  13. String nodeName = xmlPullParser.getName();
  14. switch (eventType) {
  15. case XmlPullParser.START_TAG: {
  16. if ("id".equals(nodeName)) {
  17. id = xmlPullParser.nextText();
  18. } else if ("name".equals(nodeName)) {
  19. name = xmlPullParser.nextText();
  20. } else if ("version".equals(nodeName)) {
  21. version = xmlPullParser.nextText();
  22. }
  23. break;
  24. }
  1. //完成某个节点的解析
  2. case XmlPullParser.END_TAG: {
  3. if ("app".equals(nodeName)) {
  4. Log.d("MainActivity", "id is " + id);
  5. Log.d("MainActivity", "name is " + name);
  6. Log.d("MainActivity", "version is " + version);
  7. }
  8. break;
  9. }
  10. default:
  11. break;
  12. }
  13. eventType = xmlPullParser.next();
  14. }
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }

(2)SAX解析

新建一个类继承自 DefaultHandler,并重写父类的五个方法

  1. public class ContentHandler extends DefaultHandler {
  2. private String nodeName;
  3. private StringBuilder id;
  4. private StringBuilder name;
  5. private StringBuilder version;
  6. @Override
  7. public void startDocument() throws SAXException {
  8. // TODO Auto-generated method stub
  9. id = new StringBuilder();
  10. name = new StringBuilder();
  11. version = new StringBuilder();
  12. }
  13. @Override
  14. public void endDocument() throws SAXException {
  15. // TODO Auto-generated method stub
  16. }
  17. @Override
  18. public void startElement(String uri, String localName, String qName,
  19. Attributes attributes) throws SAXException {
  20. // TODO Auto-generated method stub
  21. nodeName = localName;
  22. }
  23. @Override
  24. public void endElement(String uri, String localName, String qName)
  25. throws SAXException {
  26. // TODO Auto-generated method stub
  27. if ("app".equals(localName)) {
  28. Log.d("ContentHandler", "id is " + id.toString().trim());
  29. Log.d("ContentHandler", "name is " + name.toString().trim());
  30. Log.d("ContentHandler", "version is " + version.toString().trim());
  31. // 最后要将StringBuilder清空掉
  32. id.setLength(0);
  33. name.setLength(0);
  34. version.setLength(0);
  35. }
  36. }
  37. @Override
  38. public void characters(char[] ch, int start, int length)
  39. throws SAXException {
  40. // TODO Auto-generated method stub
  41. if ("id".equals(nodeName)) {
  42. id.append(ch, start, length);
  43. } else if ("name".equals(nodeName)) {
  44. name.append(ch, start, length);
  45. } else if ("version".equals(nodeName)) {
  46. version.append(ch, start, length);
  47. }
  48. }
  49. }

调用进行解析

  1. SAXParserFactory factory = SAXParserFactory.newInstance();
  2. XMLReader xmlReader = factory.newSAXParser().getXMLReader();
  3. ContentHandler handler = new ContentHandler();
  4. //  将ContentHandler 的实例设置到XMLReader 中
  5. xmlReader.setContentHandler(handler);
  6. //  开始执行解析
  7. xmlReader.parse(new InputSource(new StringReader(xmlData)));

四、解析 JSON 格式数据

JSON 的主要优势在于它的体积更小,在网络上传输的时
候可以更省流量

(1)数据格式

[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"7.0","name":"Clash of Clans"},
{"id":"7","version":"3.5","name":"Hey Day"}]
(2)使用使用 JSONObject解析

  1. protected void parseJSONWithJSONObject(String response) {
  2. try {
  3. //将服务器返回的数据传入到了一个 JSONArray 对象中
  4. JSONArray jsonArray = new JSONArray(response);
  5. for (int i = 0; i < jsonArray.length(); i++) {
  6. //循环遍历这个 JSONArray, 从中取出的每一个元素都是一个 JSONObject 对象
  7. JSONObject jsonObject = jsonArray.getJSONObject(i);
  8. String id = jsonObject.getString("id");//将这些数据取出
  9. String name = jsonObject.getString("name");
  10. String version = jsonObject.getString("version");
  11. Log.d("MainActivity", "id is " + id);
  12. Log.d("MainActivity", "name is " + name);
  13. Log.d("MainActivity", "version is " + version);
  14. }
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }

(3)使用 GSON

添加一个 GSON的 Jar包

首先新建与数据相对应的类,实现其getter和setter方法

解析代码

  1. Gson gson = new Gson();
  2. List<App> appList = gson.fromJson(jsonData, newTypeToken<List<App>>() {}.getType());
  3. //由于是数组,借助 TypeToken 将期望解析成的数据类型传入到 fromJson()方法中
  4. for (App app : appList) {
  5. Log.d("MainActivity", "id is " + app.getId());
  6. Log.d("MainActivity", "name is " + app.getName());
  7. Log.d("MainActivity", "version is " + app.getVersion());
  8. }

五、HttpURLConnection和HttpClient的区别(转载自:百度知道)

Volley框架中在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。Android中主要提供了两种方式来进行HTTP操作,HttpURLConnection和HttpClient。这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、以及连接池等功能。

HttpClient:
DefaultHttpClient和AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。
但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展
HttpURLConnection:
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。
      而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

       HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:
int getResponseCode():获取服务器的响应代码。
String getResponseMessage():获取服务器的响应消息。
String getResponseMethod():获取发送请求的方法。
void setRequestMethod(String method):设置发送请求的方法。
       在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。
       为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。
       简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
       使用HttpClient发送请求、接收响应很简单,只要如下几步即可。
(1)创建HttpClient对象。
(2)如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
(3)如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用
setEntity(HttpEntity entity)方法来设置请求参数。
(4)调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
(5)调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包
装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
       另外,Android已经成功地集成了HttpClient,这意味着开发人员可以直接在Android应用中使用Httpclient来访问提交请求、接收响应。比如一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。
       其实访问Web应用中被保护的页面,使用浏览器则十分简单,用户通过系统提供的登录页面登录系统,浏览器会负责维护与服务器之间的Sesion,如果用户登录的用户名、密码符合要求,就可以访问被保护资源了。
       在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页面了。

个人笔记——Android网络技术的更多相关文章

  1. Android 网络技术HTTP

    1.XML3种解析方式(DOM.SAX.PULL) 在网络上传输数据时最常用的格式有两种,XML 和JSON 这里首先明白什么是SAX是一个用于处理XML事件驱动的"推"模型,优点 ...

  2. Android网络技术

    WebView使用方法: 1.设置布局,在activity_main.xml中添加<webView> <LinearLayout...... <webView android: ...

  3. android 网络技术基础学习 (七)

    使用httpclient协议访问网络: public class MainActivity extends Activity implements OnClickListener{ public vo ...

  4. Android网络技术之WebView常用方法

    public class WebViewTest extends Activity {       private WebView wv;     private EditText et;       ...

  5. Android基础总结(9)——网络技术

    这里主要讲的是如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android最常使用到的网络技术了. 1.WebView的用法 Android提供的WebVie ...

  6. Android笔记之网络-基本了解

    1.3个相关API接口 Android网络编程相关的API接口与相关用途例如以下图 2. 2种网络架构模式 B/S----浏览器/server端模式,通过应用层的HTTP协议通信,不须要特定clien ...

  7. Android学习之基础知识十二 — 第一讲:网络技术的使用

    这一节主要讲如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android中最常用的网络技术. 一.WebView的用法 有时候我们可能会碰到比较特殊的需求,比 ...

  8. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  9. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

随机推荐

  1. 301 MovedPermanently 重定向

    页面永久性移走(301重定向)是一种非常重要的“自动转向”技术. 301重定向可促进搜索引擎优化效果 从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法.当网站的域名发生变更后,搜索引 ...

  2. Listview 利用Datapager进行分页

    原文:http://lgm9128.blog.163.com/blog/static/421734292010513111851101/ <asp:ListView ID="ListV ...

  3. windows环境下安装ZooKeeper

    $.说明 ZooKeeper: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件. 它是一个为分布式 ...

  4. 「POJ 2182」 Lost Cows

    题目链接 戳这 题目大意 \(N(2 <= N <= 8,000)\)头奶牛有\(1..N\)范围内的独特品牌.对于每头排队的牛,知道排在那头牛之前的并比那头牛的品牌小的奶牛数目.根据这些 ...

  5. 图像中的掩膜(Mask)是什么

    在图像处理中,经常会碰到掩膜(Mask)这个词.那么这个词到底是什么意思呢?下面来简单解释一下. 1.什么是掩膜 首先我们从物理的角度来看看mask到底是什么过程. 在半导体制造中,许多芯片工艺步骤采 ...

  6. session相关

    判断session是否已失效: HttpSession session=request.getSession(false); getSession(boolean)相比于getSession()更安全 ...

  7. oracle闪回存储过程

    源地址:https://www.baidu.com/link?url=qgVCi_BLGOYqxJN0Fqqt-9N0SmCwtGI70SIh-TFpx1nP6oaVoMj8H6yjEqilto6TM ...

  8. shell-脚本-作用是发现前10个最占用磁盘空间的文件

    #!/bin/bash## 这个脚本的作用是发现前10个最占用磁盘空间的文件################定义这个脚本的全区变量##################################C ...

  9. 浏览器HTTP_USER_AGENT汇总——Firefox、Chrome、IE9、IE8、IE7、IE6

    结论:  浏览器 \ OS XP(IE6) XP(IE7) XP(IE8) Win7 x64(IE9) 猎豹浏览器2.0急速模式     Chrome/21 猎豹浏览器2.0兼容模式 IE6     ...

  10. 【Leedcode】Insertion Sort List

    Sort a linked list using insertion sort. /** * Definition for singly-linked list. * struct ListNode ...