《第一行代碼--Android》讀書筆記之網絡編程

淺用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。
    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)
  • 如果需要解釋的是一段JSON數組,
    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示例項目代碼也是非常好的學習資料。多看牛人博客,當然了項目實踐也是必不可少的,祝自己好運吧!(^__^)

    發佈了32 篇原創文章 · 獲贊 45 · 訪問量 13萬+
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章