【Anroid学习笔记】 WebView、okHttp的使用,XML、JSON文件的解析

WebView

布局文件:

 
     

 

核心代码:

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之前,需要先添加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格式数据

先准备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格式数据

先准备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()); 
    } 
}

你可能感兴趣的:(Android学习笔记)