《第一行代码--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示例项目代码也是非常好的学习资料。多看牛人博客,当然了项目实践也是必不可少的,祝自己好运吧!(^__^)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值