1.OkHttp的使用
使用OkHttp需要添加库到app/build.gradle文件中,如下:
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.9.0'
}
GET
conn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
//设置要访问的网络地址
Request request = new Request.Builder()
.url("https://www.baidu.com")//http、https
.build();
//发送请求并获取数据
Response response = client.newCall(request).execute();
//取出数据
String data = response.body().string();
//进行展示
show(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
POST
conn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
RequestBody requestBody = new FormBody.Builder()
.build(); //.add("username","admin").add("psw","123123")
Request request = new Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
String data = response.body().string();
show(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
为了能直观的看到POST的效果,我在MyEclipse中创建一个Servlet,如下:
public class Conn extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String psw = request.getParameter("psw");
if (username.equals("admin") && psw.equals("123123")) {
response.setCharacterEncoding("utf-8");
PrintWriter pw = response.getWriter();
pw.print("通信成功");
}
}
}
更改在Android端的程序,如下:
RequestBody requestBody = new FormBody.Builder()
.add("username", "admin")
.add("psw", "123123")
.build();
Request request = new Request.Builder()
.url("http://192.168.1.108:8080/ConnToAndroid/Conn")
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
String data = response.body().string();
show(data);
效果如下:
2.解析XML
Pull解析方式
我使用了openFileInput()方法来读取文件,文件放在/data/data/包名/files中,取名为my.xml,内容如下:
<entity>
<Book>
<name>机动车驾驶人</name>
<author>佚名</author>
<price>0.0</price>
</Book>
</entity>
读取文件
pull_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//读取文件
InputStream inputStream = openFileInput("my.xml");
//主要用来修改编码的方式
InputStreamReader inputStreamReader = new
InputStreamReader(inputStream, "GBK");
BufferedReader buffered = new BufferedReader(inputStreamReader);
String s;
StringBuffer stringBuffer = new StringBuffer();
while ((s = buffered.readLine()) != null) {
stringBuffer.append(s);
}
buffered.close();
parseXMLWithPull(stringBuffer.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
解析xml
private void parseXMLWithPull(String xml) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xml));
int type = xmlPullParser.getEventType();
String name = "";
String prices = "";
String author = "";
while (type != XmlPullParser.END_DOCUMENT) {
String node = xmlPullParser.getName();
switch (type) {
case XmlPullParser.START_TAG:
if ("name".equals(node)) {//是否是name的节点
name = xmlPullParser.nextText();//获取节点的具体内容
} else if ("author".equals(node)) {
author = xmlPullParser.nextText();
} else if ("price".equals(node)) {
prices = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
//当读取完Book节点时,输出一下获取的内容
if ("Book".equals(node)) {
Log.i("123123", "name:" + name + ","
+ "author:" + author + ","
+ "price:" + prices);
}
break;
}
type = xmlPullParser.next();
}//while
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
SAX解析方式
创建一个类,用来继承DefaultHandler。
public class SAXHandle extends DefaultHandler {
private String nodeName;
private StringBuilder name;
private StringBuilder author;
private StringBuilder price;
//开始解析XML时调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
name = new StringBuilder();
author = new StringBuilder();
price = new StringBuilder();
}
//完成整个XML时调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//开始解析某个节点时调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//节点的名称,以便于characters()等方法的使用
nodeName = localName;
}
//完成解析某个节点的时候调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("Book".equals(localName)) {
Log.i("123123", "name:" + name.toString().trim()
+ "author:" + author.toString().trim()
+ "price:" + price.toString().trim());
name.setLength(0);
author.setLength(0);
price.setLength(0);
}
}
//获取节点内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if ("name".equals(nodeName)) {
name.append(ch, start, length);
} else if ("author".equals(nodeName)) {
author.append(ch, start, length);
} else if ("price".equals(nodeName)) {
price.append(ch, start, length);
}
}
}
读取xml文件与Pull一样,将读取到的内容给parseXMLWithSAX()方法就可以了。
private void parseXMLWithSAX(String data) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
SAXHandle saxHandle = new SAXHandle();
xmlReader.setContentHandler(saxHandle);
xmlReader.parse(new InputSource(new StringReader(data)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}