布局文件:
核心代码:
onCreate(){
WebView webView = (WebView)findViewById(R.id.web_view);
//让webView支持JS脚本
webView.getSettings().setJavaScriptEnabled(true);
//设置从一个网页跳转到另一个网页时,网页仍在当前webView显示
webView.setWebViewClient(new WebViewClient());
//传入网址
webView.loadUrl("http://www.baidu.com");
}
由于程序使用到了网络,需要修改AndroidManifest.xml文件声明权限:
在使用OkHttp之前,需要先添加OkHttp库的依赖,编辑app/build.gradle文件如下:
dependencies{ ... compile 'com.squareup.okhttp3:okhttp:3.4.1' }
先创建一个OkHttpClient的实例:
OkHttpClient client = new OkHttpClient();
接下来如果想发起一条http请求,需要创建一个Request对象:
Request request = new Request().Builder().build();
在build方法之前可以连缀多个方法来丰富Request对象:
Request request = new Request().Builder().url("http://www.baidu.com").build();
之后调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据:
Response response = client.newCall(request).execute();
其中Response对象就是服务器返回的数据了,获取返回的具体内容:
String responseData = response.body().string();
如果要发起一条POST请求,需要先构建一个RequestBody对象来存放待提交的参数:
RequestBody requestBody = new FormBody.builder()
.add("username","admin")
.add("password","123456")
.build();
然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入:
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
接下来的操作就和GET请求一样了,调用execute()方法来发送请求。
OkHttp使用示例:
onClick(){
sendRequestWithOkHttp();
}
sendRequestWithOkHttp(){
new Thread(new Runnable(){
run(){
try{
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
}catch(Exception e){
...
}
}
}).start();
}
showResponse(){
//Android只允许程序在主线程进行UI操作
runOnUiThread(new Runnable(){
run(){
//在这编写UI操作代码
responseText.setText(response);
}
})
}
先准备xml文件:
1
Google Maps
1.0
2
Chrome
2.1 <
/app>
1
Google Play
2.3
Pull解析方式
核心代码:
parseXMLWithPull(String xmlData){
try{
//先获取XmlPullParserFactory实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//借助XmlPullParserFactory实例获取XmlPullParser对象
XmlPullParser xmlPullParser = factory.newPullParser();
//将要解析的XML数据通过setInput方法设置进去
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("MainActivity","id is "+id);
Log.d("MainActivity","name is "+name);
Log.d("MainActivity","version is "+version);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
}catch(Exception e){
...
}
}
SAX解析方式
通常情况下需要新建一个类继承DefaultHandler类,并重写父类的5个方法:
class MyHandler extends DefaultHandler{
//在开始XML解析时执行
void startDocument() throws SAXException{
}
//在开始解析某个节点时执行
void startElement(String uri,String localName,String qName,Attributes attributes)
throws SAXException{
}
//在获取节点中的内容时执行
void characters(char[] ch,int start,int length) throws SAXException{
}
//在完成解析某个节点时执行
void endElement(String uri,String localName,String qName) throws SAXException{
}
//在完成整个XML解析的时候执行
void endDocument() throws SAXException{
}
}
使用SAX解析的方式对XML文件进行解析,新建一个ContentHandler类:
class ContentHandler extends DefaultHandler{
String nodeName;
StringBuilder id;
StringBuilder name;
StringBuilder version;
startDocument(){
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
startElement(){
nodeName = localName;
}
characters(){
if("id".equals(nodeName)){
id.append(ch,start,length);
}else if("name".equals(nodeName)){
name.append(ch,start,length);
}else if("version".equals(nodeName)){
version.append(ch,start,length);
}
}
endElement(){
if("app".equals(localName)){
//可能含回车或换行符,打印前需要调用trim()方法去掉
Log.d("ContentHandler","id is " + id.toString().trim());
Log.d("ContentHandler","name is " + name.toString().trim());
Log.d("ContentHandler","version is " + version.toString().trim());
//最后要将StringBuilder清空掉
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
endDocument(){
super.endDocument();
}
}
编写MainActivity里SAX解析的核心代码:
parseXMLWithSAX(String xmlData){
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将ContentHandler实例设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch(Exception e){
...
}
}
先准备JSON文件:
[
{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"7.0","name":"Boom Beach"},
{"id":"7","version":"3.5","name":"Clash Royale"}
]
使用JSONObject
核心代码:
parseJSONWithJSONObject(String jsonData){
try{
//准备的JSON文件中包含一个JSON数组,先将它传入到JSONArray对象中
JSONArray jsonArray = new JSONArray(jsonData);
for(int i=0;i
使用GSON
先在项目中添加GSON库的依赖,编辑app/build.gradle文件如下:
dependencies{ ... compile 'com.google.code.gson:gson:2.7' }
如果要解析的JSON格式的数据如下:
{"name":"Tom","age":20}
那我们可以定义一个Person类,加入name和age两个字段,调用下面代码就可以将JSON数据自动解析为一个Person对象了:
Gson gson = new Gson(); Person person = gson.fromJson(jsonData,Person.class);
如果要解析的是一段JSON数组,需要借助TypeToken将期望解析成的数据类型传入到fromJson()方法中,如下所示:
List people = gson.fromData(jsonData,new TypeToken>() {}.getType());
现在使用GSON对原先的JSON文件进行解析,新增一个App类:
class App{
String id;
String name;
String version;
//三个字段的get和set方法
...
}
GSON解析核心代码:
parseJSONWithGSON(String jsonData){
Gson gson = new Gson();
List appList = gson.fromJson(jsonData,new TypeToken>(){}.getType());
for(App app:appList){
Log.d("MainActivity","id is "+app.getId());
Log.d("MainActivity","version is "+app.getVersion());
Log.d("MainActivity","name is "+app.getName());
}
}