Android学习(九)初学网络技术

网络开发

现在大部分app都会包含网络开发,网络开发可以极大丰富内容。这里只是一些基本的网络开发技术学习。

HTTP开发 HttpURLConnection

这里我们使用的是HttpURLConnection进行HTTP开发。

  1. 创建一个URL对象,指定访问地址
URL url = new URL("https://www.baidu.com/");
  1. 获取HttpURLConnection对象实例,进行自定义配置
HttpURLConnection httpURLConnection = null;
...
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");  //请求类型
httpURLConnection.setConnectTimeout(5000);  //连接超时
httpURLConnection.setReadTimeout(5000); //读取超时
  1. 调用getInputStream()获取网络返回的输入流

获取输入流后,可以对数据进行赌气

InputStream inputStream = httpURLConnection.getInputStream();
...
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer data = new StringBuffer();
String flag;
while ((flag = bufferedReader.readLine()) != null) {
         data.append(flag);
}

  1. 最后调用disconnect()关闭连接
httpURLConnection.disconnect(); //关闭连接

完整代码

        BufferedReader bufferedReader = null;
        try {
            URL url = new URL("https://www.baidu.com/");
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");  //请求类型
            httpURLConnection.setConnectTimeout(5000);  //连接超时
            httpURLConnection.setReadTimeout(5000); //读取超时
            InputStream inputStream = httpURLConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer data = new StringBuffer();
            String flag;
            while ((flag = bufferedReader.readLine()) != null) {
                data.append(flag);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (httpURLConnection != null) {
                httpURLConnection.disconnect(); //关闭连接
            }
        }

解析网络数据

网络传输比较常用的两种数据格式如下:

XML格式

Pull解析
  1. 获取XmlPullParser对象实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
  1. 通过setInput()方法进行解析
xmlPullParser.setInput(new StringReader(xmlString));
  1. 采用while循环

调用getEventType(),判断解析进度
通过getName()获取节点名称和nextText()获取节点内容

int eventType = xmlPullParser.getEventType();   //解析事件
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String dataName = xmlPullParser.getName();  //节点名称
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        //处理开始解析的逻辑
                        String data = xmlPullParser.nextText(); //节点内容
                        break;
                    case XmlPullParser.END_TAG:
                        //某个节点解析完成
                        break;
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }

完整代码

private void parsePull(String xmlString) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlString));
            int eventType = xmlPullParser.getEventType();   //解析事件
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String dataName = xmlPullParser.getName();  //节点名称
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        //处理开始解析的逻辑
                        String data = xmlPullParser.nextText(); //节点内容
                        break;
                    case XmlPullParser.END_TAG:
                        //某个节点解析完成
                        break;
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
SAX解析
  1. 创建一个类继承
package com.example.testapplication;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TestHandle extends DefaultHandler {

    private String flag;
    private StringBuffer data;

    @Override
    public void startDocument() throws SAXException {
        //开始解析时,逻辑处理
        data = new StringBuffer();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        flag = localName;   //记录节点名称
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //如果节点名称匹配,存入数据
        data.append(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        //节点解析结束时,逻辑处理
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        // 全部解析解析时,逻辑处理
    }

}
  1. 代码进行解析
    private void parseSAX(String xmlString) {
        try {
            //获取XMLReader对象
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            //配置内容事件处理的handle
            TestHandle handle = new TestHandle();
            xmlReader.setContentHandler(handle);
            //获取InputSource,进行解析
            StringReader stringReader = new StringReader(xmlString);
            InputSource inputSource = new InputSource(stringReader);
            xmlReader.parse(inputSource);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

JSON格式

JSON格式下的数据,体积更小,但不如XML直观。

JSONObject
  1. 获取JSONObject
  2. 读取数据

例如

    private void parseJSONObject (String jsonString) {
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            String data = jsonObject.getString("test");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
GSON

该方法由谷歌提供,使用起来更加方便快捷。
我们可以直接把数据转换成对象取出。

  1. 根据数据格式,创建对象
package com.example.testapplication;

public class Test {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

  1. 解析
    private void parseGson(String jsonString) {
        Test test = new Gson().fromJson(jsonString, Test.class);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值