今天使用OkHttp库开发安卓网络编程这一块。
然后,先尝试一个简单的获取服务器XML数据,然后进行解析,代码如下:
private void requestXml(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://url/android/get_data.xml").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseXml(responseData);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void parseXml(String xmlData){
try{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
while(eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch (eventType){
//开始解析节点
case XmlPullParser.START_TAG:{
if("id".equals(nodeName)){
id= xmlPullParser.nextText();
}else if("name".equals(nodeName)){
name = xmlPullParser.nextText();
}else if("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
break;
}
//完成解析某个节点
case XmlPullParser.END_TAG:{
if("app".equals(nodeName)){
Log.d(TAG, "id is"+id);
Log.d(TAG, "name is"+name);
Log.d(TAG, "version is"+version);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
}catch (Exception e){
e.printStackTrace();
}
}
本来以为应该很轻松就能成功,可是,当我开始运行的时候,OkHttp总是会报一个错误,如下:
W/System.err: java.net.UnknownServiceException: CLEARTEXT communication to 10.128.249.120 not permitted by network security policy
这个错误,我在网上查到这个主要是由于,我们的OkHttp3会默认使用密文传输,而我们的代码中使用Http协议,也就是使用明文传输,所以OkHttp3会主动的报错,然后阻止线程的运行。所以我们现在就是要修改配置文件,使OkHttp3允许使用明文传输,或者我们直接使用Https协议。
下面,我就如何允许使用明文传输,说明一下方法:
1:在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在 AndroidManifest.xml application 标签内应用上面的xml配置:
<application
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
</application>
2:服务器和本地应用都改用 https (推荐)
3:targetSdkVersion 降级回到 27