起因是自己在实际操作的过程中在这一节卡住了,因为此书是2014年的,有些地方难免与现在有些不一样。而这些正好能祛除我的浮躁。
工具:Android Studio 2.2.2
网络上传输数据时最常用的格式有两种:XML和JSON,所以学习XML的解析是很有必要的。
解析XML有三种方式:PULL、SAX和DOM,书中只讲了前两种。本文以第一种为例。
新建名为get_data.xml文件。
<apps>
<app>
<id>1</id>
<name>google maps</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>google play</name>
<version>2.3</version>
</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,没有自动连接。真机测试,没联网玩个鬼。
打完,收工。
编程,还是要静下心来。