淺用WebView
- 簡單配置佈局
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webview_1">
</WebView>
- 具體代碼
public class MainActivity extends Activity {
private WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webview=(WebView)findViewById(R.id.webview_1);
//完成JavaScript的啓動
webview.getSettings().setJavaScriptEnabled(true);
//配置WebViewClient。WebViewClient是一個事件接口,通過提供自己實現的WebViewClient,可響應各種渲染事件。
webview.setWebViewClient(new WebViewClient(){
//必須覆蓋此方法,當有新的URL加載到WebView(比如點擊了某個鏈接),該方法會決定下一步的行動。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//返回false,表示:“WebView去加載這個URL,我不會對它做任何處理。”;返回true,表示:“不要處理這個URL,我自己來”。
//webview.loadUrl(url);
return false;
};
});
webview.loadUrl("http://www.baidu.com");
}
}
使用HTTP協議訪問網絡
由於在Android 5.0的API版本中,HttpClient被廢棄了,官方文檔上說用HttpURLConnection代替,所以HttpClient的用法就不再談了。具體可參考郭大大的博文, Android訪問網絡,使用HttpURLConnection還是HttpClient?
需要注意的是:
- 真正發送連接請求的是調用connection.getInputStream()方法的時候。
- Android4.0後所有網絡方面的操作都不能在主線程!
- 記得加權限 < uses-permission android:name=”android.permission.INTERNET”/>
public void sendRequestwithHttpURLConnection(){
HttpURLConnection httpURLConnection=null;
try {
URL url=new URL("http://www.baidu.com");
httpURLConnection=(HttpURLConnection)url.openConnection();
httpURLConnection.setReadTimeout(8000);
httpURLConnection.setReadTimeout(8000);
httpURLConnection.setRequestMethod("GET");
InputStream in=httpURLConnection.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
String line;
StringBuilder stringBuilder=new StringBuilder();
while((line=reader.readLine())!=null){
stringBuilder.append(line);
}
Message msg=new Message();
msg.what=UPDATE_TEXT;
msg.obj=stringBuilder.toString();
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
解析網絡數據
解析XML格式數據
- Pull解析方式
- PULL 的工作原理:
XML pull提供了開始元素和結束元素。當某個元素開始時,可以調用parser.nextText從XML文檔中提取所有字符數據。當解析到一個文檔結束時,自動生成EndDocument事件。 - 得到XmlPullParser對象,XmlPullParserFactory.newInstance.newPullParser();
- 設置XML數據,xmlPullParser.setInput(new StringReader(xmlData));
- 調用xmlPullParser的getEventType()和next()解析事件,nextText()獲取結點的內容。讀取到xml的聲明返回 START_DOCUMENT; 結束返回 END_DOCUMENT ; 開始標籤返回 START_TAG;結束標籤返回 END_TAG; 文本返回 TEXT。
- PULL 的工作原理:
public void pullxml(InputStream in) throws Exception {
// 由android.util.Xml創建一個XmlPullParser實例
XmlPullParser parser = Xml.newPullParser();
// 設置輸入流 並指明編碼方式
parser.setInput(in, "UTF-8");
// 產生第一個事件
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
// 判斷當前事件是否爲文檔開始事件
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Book>();// 初始化list集合
break;
// 判斷當前事件是否爲標籤元素開始事件
case XmlPullParser.START_TAG:
if (parser.getName().equals("book")) { // 判斷開始標籤元素是否是book
book = new Book();
} else if (parser.getName().equals("id")) {
eventType = parser.next();
// 得到book標籤的屬性值,並設置book的id
book.setId(Integer.parseInt(parser.getText()));
} else if (parser.getName().equals("name")) { // 判斷開始標籤元素是否是book
eventType = parser.next();
book.setName(parser.getText());
} else if (parser.getName().equals("price")) { // 判斷開始標籤元素是否是price
eventType = parser.next();
book.setPrice(Float.parseFloat(parser.getText()));
}
break;
// 判斷當前事件是否爲標籤元素結束事件
case XmlPullParser.END_TAG:
if (parser.getName().equals("book")) { // 判斷結束標籤元素是否是book
list.add(book); // 將book添加到books集合
book = null;
}
break;
}
// 進入下一個元素並觸發相應事件
eventType = parser.next();
}
return list;
}
}
- SAX解析方式
- 其實SAX跟pull差不多,就是把解析具體結點的操作封裝成一個DefaultHandler類。首先要自定義一個類繼承自DefaultHandler。
- 獲取XMLReader實例,SAXParserFactroy.newInstance.newSAXParser().getXMLReader();
- 將自定義的MyHandler實例設置到XMLReader中
- 調用xmlreader的parser開始解析,xmlReader.parse(new InputSource(new StringReader(xmlData)));
public class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
//開始XML解析的時候調用
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//開始解析某個結點的時候調用。
super.startElement(uri, localName, qName, attributes);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//獲取結點內容時調用
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//完成解析某個結點的時候調用
super.endElement(uri, localName, qName);
}
@Override
public void endDocument() throws SAXException {
//完成整個XML解析的時候調用
super.endDocument();
}
}
解析JSON格式數據
- 使用JSONObject
- 把jsonData轉化成JSONArray
- 從JSONArray取出JSONObject
- 從JSONObject中取出字段
private void parseJASONWithJSONObject(String jsonData){
try {
//把jsonData轉化成JSONArray
JSONArray jsonArray=new JSONArray(jsonData);
for(int i=0;i<jsonArray.length();i++){
//從JSONArray取出JSONObject
JSONObject jsonObject=jsonArray.getJSONObject(i);
//從JSONObject中取出字段
String id=jsonObject.getString("id");
String name=jsonObject.getString("name");
String version=jsonObject.getString("version");
}
} catch (Exception e) {
e.printStackTrace();
}
}
使用GSON
json數據格式定義: json數據只有兩種格式.
一種是對象: 一個大括號包裹的內容就是一個對象.裏面是無數個逗號相間隔的鍵值對
{ “firstName”: “Brett”, “lastName”:”McLaughlin”, “email”: “aaaa” }
一種是數組:一個方括號包裹的內容就是一個數組,裏面是無數個逗號相間隔的json對象>
- 如果需要JSON的字符串可以映射成一個JSON對象。
1、json的數據結構定義出相應的javabean
2、”new”出Gson的實例gson
3、gson.fromJson(jsonString,JavaBean.class)
list< Person> people=gson.fromJson(jsonString,new TypeToken< list< Person>().getType());
GSON相關知識,值得參考的博文: Gson解析json數據
參考的博客和文獻:
怎樣使用Gson 解析 (deserialize) json字符串:
http://jingyan.baidu.com/article/17bd8e521f1cf385ab2bb819.html
Android解析XML(PULL方式)和JSON 工作原理和實現過程:
http://www.android100.org/html/201406/07/20575.html
SAX解析XML 詳解:
http://yangjunfeng.iteye.com/blog/401377
後記
至此,《第一行代碼》讀書筆記系列完結!本書的第12章特色開發屬於查閱型知識就不另外細說了。把全書重要的知識點在一週時間內總結成9篇博文,感覺還挺high的,期間在網上查閱了許多資料,原來書上一筆帶過的知識點,通過這一次總結性的二次閱讀,我有了更大的收穫和更深入的理解。其實,一開始寫完第一篇的時候,我心裏面就有一些抗拒,有放棄的念頭,但既然最初選擇了就要堅持走下去。另外,書中的git知識是一大亮點,我打算再找時間系統地學習一下基本用法,github真是一個寶庫呢,裏面很多的開源庫真的非常驚豔,非常值得研究學習。Android開發的自學探索之路還非常漫長,但不能急,有耐心,循序漸進,一步步來,始終保持激情。Fuel with code! 爲了完成入門,我打算把官方文檔裏面的train,API Guide部分自學過一遍,SDK裏面的sample示例項目代碼也是非常好的學習資料。多看牛人博客,當然了項目實踐也是必不可少的,祝自己好運吧!(^__^)