Android之使用网络技术

WebView的用法

1.1 什么是WebView

  • 当要求在应用程序中展示一些网页,又不允许打开系统浏览器时,我们就要用WebView控件来展示各种网页。

1.2 WebView的使用

  1. 在主布局中设置WebView控件。

  2. 获取实例后,调用它的getting().setJavaScriptEnabled()方法来让WebView支持javaScript脚本。然后再调用setWebViewVlient()方法,传入一个WebViewClient实例,它的作用是当需要从一个网页跳转到另一个网页的时候,目标网页仍然在当前WebView中显示,而不会打开系统浏览器。
    在这里插入图片描述

  3. 在注册表中声明权限。
    在这里插入图片描述

使用HTTP协议访问网络

  • 工作原理:客户端向服务器发出一条HTTP请求,服务器接收请求之后会返回一些数据给客户端,客户端在对这些数据进行解析和处理。上一个WebView就是向百度的服务器发了一个HTTP请求,WebView后台已经帮我们封装好了发送HTTP请求,接收服务器反应,解析返回的数据。

2.1 使用HttpURLConnection发送HTTP请求

2.1.1 HttoURLConnection的使用步骤

  1. 先创建一个URL实例,并传入网址。
  2. 根据url对象的openConnection()方法来获取到HttpURLConnection实例connection。
  3. 可以根据connection的setRequestMethod()方法来设置从服务器那里是获取数据还是提交数据。参数分别为GET 和 POST。
  4. 可以根据connection的setConnectTimeout()方法来设置连接超时。
  5. 根据connection的setReadTimeout()方法设置读取超时的毫秒数。
  6. 再调用它的getInputStream()方法,就可以获取到输入流了。
  7. 最后要调用它的disconnect()来将这个HTTP连接关闭掉。
    在这里插入图片描述
  • :这里的控件我们使用了ScollView,这是一个可以以滚动形式查看屏幕外的那部分内容的控件。
    在这里插入图片描述
    逻辑为点击按钮,发送网络请求,最后把返回的数据解析并显示在手机屏幕ScollView控件中。

2.2 使用OkHttp访问网络

2.2.1 什么是OkHttp

  • OkHttp是Squera公司开发的,这个公司除了开发了OkHttp之外,还开发了Picasso,Retrofit等著名开源项目。它比起原生的HttpURLConnection,是有过之而无不及,OkHttp现在已经称为广大Android开发者首选的网络通信库。

2.2.2 使用OkHttp的步骤

  1. 在gradle中添加OkHttp库的依赖。
    在这里插入图片描述
    添加这个依赖会自动下载两个库,一个是OkHtp库,一个是Okio库,后者是前者的通信基础。
  2. 创建一个OkHttpClient对象实例client。
  3. 如果要发送一个Http请求,要建立一个Request对象request。
  4. 再在建立request对象时可以在builder()后连缀许多其他方法来丰富对象,我们在这里连缀一个Url来表示要访问的服务器。
  5. 之后调用OkHttpClient的newCall方法传入刚刚的request来建立一个Call对象,然后调用他的execute()方法来发送请求并返回数据。
  6. 我们用Response对象来接收上述返回数据。
  7. 然后我们调用response的body()方法来将数据以特定格式存入body区域,再调用toString方法获得字符串形式。
    在这里插入图片描述

解析XML格式数据

  • 在网络上传输数据常用的格式有两种,一种是XML一种是JSON,当一方接收数据时,要按照相应的格式,来解析,从而取出想要的那部分内容。

3.1 使用Pull方式解析XML格式数据

  • 这里我们还是借助OkHttp方式来访问网络。对返回的XML数据解析。

3.1.1 使用Pull方式解析的步骤

  1. 先获取XmlPullParserFactory实例,通过XmlPullParserFactory.newInstamce()方法获取。
  2. 然后借助该实例,得到XmlPullParser对象。
  3. 调用XmlPullParser的setInput()方法将服务器返回的XML数据设置进去就可以开始解析了。
  4. 通过getEventType()可以得到当前的解释事件。在一个while循环里不停解析,如果当前的解析事件不等于XmlPullParser.END_DUCUMENT,说明解析工作没有完成,然后调用next()方法可以获取下一个解析时间。
  5. 在while()循环中,通过getName()方法得到当前节点的名字,如果发现节点名等于id,nama或者version,就调用nextText‘()方法来获取节点内具体的内容。
    在这里插入图片描述
    xml数据如下:
    在这里插入图片描述

3.2 使用SAX方式解析XML

  • SAX解析方式是一种特别常用的XML解析方式,虽然它的用法比Pull解析要复杂一些,但是在理解方面更加清晰。

3.2.1 如何使用SAX方法解析

  1. 新建一个类继承DefaultHandler,并重写父类的5个方法。
  2. 我们为三个节点分别定义一个StringBuilder对象,并在startDocument中初始化,使用localName记录当前节点的名字。打印完成后要将StringBuilder内容清空掉,防止影响下一次内容读取。
// A code block
var foo = 'bar';
public class MyHandler extends DefaultHandler {

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;

    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        nodeName = localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if("app".equals(localName)){
            Log.d("MainActivity.this","id is " + id);
            Log.d("MainActivity.this","name is " + name);
            Log.d("MainActivity.this","version is " + version);
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        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);
        }
    }
}~
  • 其中startDocument()方法会在开始解析XML时调用,startElement()方法会在开始解析某个节点时调用,characters()方法会在获取节点中内容时调用,endElement()方法会在完成某个节点解释时调用,endDocument()方法会在完成整个XML解析时调用。
  • 注意:在获取节点内容的时候,charaacters()方法可能会被调用多次,一些换行符也会解析出来,我们要在代码中做好控制。
  1. 得到服务器返回数据之后,我们先创建一份SAXParserFactory对象,然后获取到XMLReader对象,接着将我们编写的ContentHandler实例设置到XmlReader中再调用parse()方法解析就好了。
    在这里插入图片描述

解析JSON数据

  • JSON格式数据比XML数据更好,因为它的体积小,在网络上传输时可以省流量,但缺点在于它的语义性较差,看起来不是很直观。

4.1 使用JSONObject解析JSON

4.1.1 使用JSONObject解析的步骤

  1. 先建立一个JSONArray数组对象,并传入服务器返回的数据。
  2. 根据数组长度循环遍历数组,建立JSONObject对象来存每一个数组单项,再调用getString()方法分别取出里面元素即可。
    在这里插入图片描述

4.2 使用GSON来解析JSON数据

  • GSON是谷歌提供的一个开源库,使用它来解析JSON数据简单到让你无法想象。

4.2.1 使用GSON的步骤

  1. 由于GSON并没有被添加到官方的API中,所以要在项目中添加GSON的依赖。
    在这里插入图片描述
  2. GSON可以将一段JSON的字符串自动映射成对象。即我们可以根据JSON中的节点,来创建一个类,把每一个节点变成一个对象来解析。比如刚才的JSON数据。
    在这里插入图片描述
  3. 接下来我们建立一个GSON对象。
  4. 创建一个集合,泛型为类名,调用gson的fromJson方法并传入两个参数,一个是服务器返回的数据,一个是期望解析的数据类型,如果JSON数据比较麻烦,还可以借助TypeToken将期望解析的数据传入到fromJson()方法中。
  5. 再遍历集合,取值就完成了解析。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值