《第一行代码》第十章-Pull解析方式

起因是自己在实际操作的过程中在这一节卡住了,因为此书是2014年的,有些地方难免与现在有些不一样。而这些正好能祛除我的浮躁。

工具:Android Studio 2.2.2

网络上传输数据时最常用的格式有两种:XML和JSON,所以学习XML的解析是很有必要的。
解析XML有三种方式:PULL、SAX和DOM,书中只讲了前两种。本文以第一种为例。

新建名为get_data.xml文件。

<apps>
    <app>
        <id>1id>
        <name>google mapsname>
        <version>2.1version>
    app>
    <app>
        <id>3id>
        <name>google playname>
        <version>2.3version>
    app>
apps>

在写sendRequestWithHttpClient方法时,会出现根本没有HttpClient类。

查了资料才知道:

HttpClient会在谷歌的安卓中消失的原因
一开始,谷歌安卓新出,库中自带HttpClient 4.0 测试预览版。为与安卓保持API同步,HTTPClient不敢打动干戈。后来,HTTPCient 4.0逐渐成熟,Apache欲使Android跟进更新对应的库,Android拒绝了。然而旧库bug丛生,瑕疵遍地。故,今Apache新出一个HTTPClient for android。
那既然Android自带的不好,为啥不直接导入Apache的呢?因为包名是一样的,库冲突。不是不能解决,也能,据说比较麻烦(笔者没试过)。从Apache下载最新的httpclient源码,把每个源文件包名改了,改成Android不冲突的。然后打包成jar文件,然后导入到Android工程的lib里。
现在,Android 6.0 已经移除了httpClient,于是我们可以从Apache下载HttpClient,然后导入到lib中,不用改名了。

解决办法:

1.eclipse
libs中加入 org.apache.http.legacy.jar
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)

2.android studio:
在相应的,module下的build.gradle中加入:
android{
useLibrary ‘org.apache.http.legacy’
}

在加入jar包的时候又出现了幺蛾子,因为对Android Studio还不是很熟悉,当把jar放进libs目录,发现在项目的project列表里面没有libs目录。

原来目录结构是可以切换的,之前切换过,又忘了。

private void sendRequestWithHttpClient(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                HttpClient httpClient = new DefaultHttpClient();
                //www.suqin.wang是我的个人网站,我把XML文件上传到网站了,大家可以使用,因为不是很明白书上是怎么设置IP的。
                HttpGet httpGet = new HttpGet("http://www.suqin.wang/get_data.xml");
                HttpResponse httpResponse = httpClient.execute(httpGet);
                if(httpResponse.getStatusLine().getStatusCode() == 200){
                    HttpEntity entity = httpResponse.getEntity();
                    String response = EntityUtils.toString(entity,"utf-8");
                    parseXMLWithPull(response);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }).start();
}

本来以为可以在logcat看到结果了,发现鬼的结果都没有。只有报错:android上java.net.UnknownHostException: Unable to resolve host “xxxx”: No address associated wit。

咋办?凉拌。

这是由于我们在开发的过程中没有给模拟器和Manifest开放网络导致的,
解决方法目前有两种:

1、android设备网络连接没打开,例如3G网络和WIFI网络
2、Manifest文件没有标明网络访问权限

最后检查的结果是又忘记开WIFI了,而见鬼的路由器经常断线,我开了WIFI,没有自动连接。真机测试,没联网玩个鬼。

打完,收工。

编程,还是要静下心来。

你可能感兴趣的:(Android)