• $《第一行代码:Android》读书笔记——第10章 Android网络编程


    (一)WebView的用法
    1、WebView也是一个普通的控件。
    2、常用用法:
     1 WebView webView = (WebView)findViewById(R.id.web_view);
     2 webView.getSettings( ).setJavaScriptEnabled(true);    //让webView支持javascript脚本
     3 webView.setWebViewClient(new WebViewClient( ){
     4     @Override
     5     public boolean shouldOverrideUrlLoading(WebView view, String url){
     6            view.loadUrl(url);    //根据传入的参数再去加载新的网页
     7            return true;    //表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器
     8     }
     9 });
    10 webView.loadUrl("http://www.baidu.com");

    3、使用任何网络功能的程序都要申请权限:

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

    (二)使用HttpURLConnection访问网络

    1、步骤如下:
    (1)创建一个URL对象,然后使用其openConnection创建一个HttpURLConnection对象:
    1 URL url = new URL("http://www.baidu.com");
    2 connection = (HttpURLConnection) url.openConnection();

    (2)设置HttpURLConnection是GET方法还是POST方法:

    1 connection.setRequestMethod("GET");

    (3)对HttpURLConnection进行其他的设置:

    1 connection.setConnectTimeout(8000);    //设置连接超时的毫秒数
    2 connection.setReadTimeout(8000);    //设置读取超时的毫秒数

    (4)用HttpURLConnection对象的getInputStream方法获取服务器的返回输入流InputStream对象:

    1 InputStream in = connection.getInputStream();

    (5)对输入流进行读取:

    1 BufferedReader reader = new BufferedReader(
    2 new InputStreamReader(in));
    3 StringBuilder response = new StringBuilder();
    4 String line;
    5 while ((line = reader.readLine()) != null) {
    6     response.append(line);
    7 }

    (6)用disconnect方法关闭这个HTTP连接:

    1 connection.disconnect();

    2、注意:

    (1)网络请求要放在子线程里。
    (2)在子线程里网络请求获取返回数据后,如果要进行UI操作,则要采用异步消息处理方法。
    (3)要申请网络权限。
     
    (三)使用HttpClient访问网络
    1、HttpClient是一个接口类,是Apache提供的HTTP网络访问接口,从一开始就被引入到了Android API中。
    2、使用步骤:
    (1)创建HttpClient实例:
    1 HttpClient httpClient = new DefaultHttpClient();
    (2)根据发起请求的类型不同,下面的第(2)步的步骤也不同:
    ①GET请求:
    1 HttpGet httpGet = new HttpGet("http://10.0.2.2:8081/get_data.xml");

    ②POST请求:

    1 HttpPost httpPost = new HttpPost("http://www.baidu.com");
    2 List<NameValuePair> params = new ArrayList<NameValuePair>();
    3 params.add(new BasicNameValuePair("username","admin"));
    4 params.add(new BasicNameValuePair("password","123456"));
    5 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
    6 httpPost.setEntity(entity);

    (3)获取服务器返回值:

    1 HttpResponse httpResponse = httpClient.execute(httpGet);

    (4)判断返回状态码,如果等于200就表示请求和响应都成功了:

    1 if (httpResponse.getStatusLine().getStatusCode() == 200) {
    2     HttpEntity entity = httpResponse.getEntity();
    3     String response = EntityUtils.toString(entity, "utf-8");
    4     ...    //其他操作
    5 }

    3、注意:HttpClient访问网络同样要放在子线程里、申请网络权限。

     

    (四)使用回调机制封装HttpURLConnection操作来创建HttpUtil类
    1、创建HttpCallbackListener接口:
    1 public interface HttpCallbackListener {
    2     void onFinish(String response);    //在服务器成功响应请求时调用
    3     void onError(Exception e);    //进行网络操作出错时调用
    4 }

    2、创建HttpUtil类:

     1 import java.io.BufferedReader;
     2 import java.io.InputStream;
     3 import java.io.InputStreamReader;
     4 import java.net.HttpURLConnection;
     5 import java.net.URL;
     6 
     7 public class HttpUtil {
     8     public static void sendHttpRequest(final String address,final HttpCallbackListener listener) {
     9         new Thread(new Runnable() {
    10             @Override
    11             public void run() {
    12                 HttpURLConnection connection = null;
    13 
    14                 try {
    15                     URL url = new URL(address);
    16                     connection = (HttpURLConnection) url.openConnection();
    17 
    18                     connection.setRequestMethod("GET");
    19                     connection.setConnectTimeout(8000);
    20                     connection.setReadTimeout(8000);
    21                     connection.setDoInput(true);
    22                     connection.setDoOutput(true);
    23 
    24                     InputStream in = connection.getInputStream();
    25                     BufferedReader reader = new BufferedReader(
    26                             new InputStreamReader(in));
    27                     StringBuilder response = new StringBuilder();
    28                     String line;
    29 
    30                     while ((line = reader.readLine()) != null) {
    31                         response.append(line);
    32                     }
    33 
    34                     if (listener != null) {
    35                         // 回调onFinish方法
    36                         listener.onFinish(response.toString());
    37                     }
    38 
    39                 } catch (Exception e) {
    40                     if (listener != null) {
    41                         listener.onError(e);
    42                     }
    43                 } finally {
    44                     if (connection != null) {
    45                         connection.disconnect();
    46                     }
    47                 }
    48             }
    49         }).start();
    50     }
    51 }

    3、使用时这样使用:

     1 HttpUtil.sendHttpRequest("http://www.baidu.com",new HttpCallBackListener(){
     2     @Override
     3     public void onFinish(String response){
     4         //在这里根据返回内容执行具体的逻辑
     5     }
     6 
     7     @Override
     8     public void onError(Exception e){
     9         //在这里对异常情况进行处理
    10     }
    11 });

     

    (五)解析XML数据

    1、安装Apache服务器:下载安装包,然后安装成功后启动服务器,在浏览器里输入127.0.0.1,会看到Apache的字样。
    2、在Apache安装目录:...Apachehtdocs目录下,可以新建一个xml文件,命名为get_data.xml,加入内容,然后在浏览器里输入:127.0.0.1/get_data.xml(在手机模拟器里要输入:10.0.2.2/get_data.xml),就会显示出该文件的内容。
    3、编写的XML数据的格式如下:
     1 <apps>
     2     <app>
     3         <id>1</id>
     4         <name>Google Maps</name>
     5         <version>1.0</version>
     6     </app>
     7     <app>
     8         <id>2</id>
     9         <name>Chrome</name>
    10         <version>1.8</version>
    11     </app>
    12     <app>
    13         <id>3</id>
    14         <name>Google Play</name>
    15         <version>3.2</version>
    16     </app>
    17 </apps>

    4、用Pull方式解析XML数据:

     1 private void parseXMLWithPull(String xmlData) {
     2         try {
     3             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
     4             XmlPullParser xmlPullParse = factory.newPullParser();
     5             xmlPullParse.setInput(new StringReader(xmlData));
     6             int eventType = xmlPullParse.getEventType();
     7 
     8             String id = "";
     9             String name = "";
    10             String version = "";
    11 
    12             while (eventType != XmlPullParser.END_DOCUMENT) {
    13                 String nodeName = xmlPullParse.getName();
    14                 switch (eventType) {
    15                 // 开始解析某个结点
    16                 case XmlPullParser.START_TAG: {
    17                     if ("id".equals(nodeName)) {
    18                         id = xmlPullParse.nextText();
    19                     } else if ("name".equals(nodeName)) {
    20                         name = xmlPullParse.nextText();
    21                     } else if ("version".equals(nodeName)) {
    22                         version = xmlPullParse.nextText();
    23                     }
    24                 }
    25                     break;
    26                 // 完成解析某个结点
    27                 case XmlPullParser.END_TAG: {
    28                     if ("app".equals(nodeName)) {
    29                         Log.d("MainActivity", "id is " + id);
    30                         Log.d("MainActivity", "name is " + name);
    31                         Log.d("MainActivity", "version is " + version);
    32                     }
    33                 }
    34                     break;
    35                 default:
    36                     break;
    37                 }
    38 
    39                 eventType = xmlPullParse.next();
    40             }
    41         } catch (Exception e) {
    42             e.printStackTrace();
    43         }
    44     }
    5、用SAX方式解析XML数据步骤:
    (1)创建ContentHandler 类继承自DefaultHandler并重写5个方法:
     1 import org.xml.sax.Attributes;
     2 import org.xml.sax.SAXException;
     3 import org.xml.sax.helpers.DefaultHandler;
     4 
     5 import android.util.Log;
     6 
     7 public class ContentHandler extends DefaultHandler {
     8     private String nodeName;
     9     private StringBuilder id;
    10     private StringBuilder name;
    11     private StringBuilder version;
    12 
    13     @Override
    14     public void startDocument() throws SAXException {
    15         id = new StringBuilder();
    16         name = new StringBuilder();
    17         version = new StringBuilder();
    18     }
    19 
    20     @Override
    21     public void startElement(String uri, String localName, String qName,
    22             Attributes attributes) throws SAXException {
    23         // 记录当前结点名
    24         nodeName = localName;
    25     }
    26 
    27     @Override
    28     public void characters(char[] ch, int start, int length)
    29             throws SAXException {
    30         // 根据当前结点名判断将内容添加到哪一个StringBuilder对象中
    31         if ("id".equals(nodeName)) {
    32             id.append(ch, start, length);
    33         } else if ("name".equals(nodeName)) {
    34             name.append(ch, start, length);
    35         } else if ("version".equals(nodeName)) {
    36             version.append(ch, start, length);
    37         }
    38     }
    39 
    40     @Override
    41     public void endElement(String uri, String localName, String qName)
    42             throws SAXException {
    43         // 用trim方法去掉空白字符
    44         if ("app".equals(localName)) {
    45             Log.d("MainActivity", "id is " + id.toString().trim());
    46             Log.d("MainActivity", "name is " + name.toString().trim());
    47             Log.d("MainActivity", "version is " + version.toString().trim());
    48 
    49             // 将StringBuilder清空
    50             id.setLength(0);
    51             name.setLength(0);
    52             version.setLength(0);
    53         }
    54     }
    55 
    56     @Override
    57     public void endDocument() throws SAXException {
    58     }
    59 }

    (2)写具体方法:

     1 private void parseXMLWithSAX(String xmlData) {
     2         try {
     3             SAXParserFactory factory = SAXParserFactory.newInstance();
     4             XMLReader xmlReader = factory.newSAXParser().getXMLReader();
     5             ContentHandler handler = new ContentHandler();
     6 
     7             xmlReader.setContentHandler(handler);
     8 
     9             // 开始执行解析
    10             xmlReader.parse(new InputSource(new StringReader(xmlData)));
    11         } catch (Exception e) {
    12             e.printStackTrace();
    13         }
    14 }

     

     

    (六)解析Json数据

     

      见我的博客园文章:用GSON解析Json格式数据,这里不再详写。

      

      【本章结束】

  • 相关阅读:
    Python爬虫开发【第1篇】【爬虫案例】
    Python爬虫开发【第1篇】【动态HTML、Selenium、PhantomJS】
    Python爬虫开发【第1篇】【多线程爬虫及案例】
    C 调用 lua 函数
    预编译头文件 StdAfx.h
    系统托盘图标
    C 语言文件操作
    Unicode
    lua 的 WriteFile 和 ReadFile
    CreateFile,WriteFile,ReadFile
  • 原文地址:https://www.cnblogs.com/jiayongji/p/5310462.html
Copyright © 2020-2023  润新知