PC、手机、平板,还是电视,几乎都会具备上网的功能,在可预见的未来,手表、眼镜、汽车等设备也会逐个加入到这个行列,21世纪的确是互联网的时代。Android系统也提供了网络功能,对于开发者,如何使用这些网络功能来编写程序是很重要的。

WebView

加载和显示网页通常都是浏览器的任务,如果要在应用程序中展示网页而不通过系统浏览器来实现,则需要借助WebView控件,借助它就可以在应用程序里嵌入一个浏览器,从而非常轻松地展示各种各样的网页。
WebView常用的方法如下:

  • getSettings():设置一些浏览器的属性
  • setJavaScriptEnabled():设置浏览器是否支持JavaScript,要在WebView控件调用**getSettings()**方法之后才调用
  • setWebViewClient():传入一个WebViewClient的实例。这个方法作用是:当需要从一个网页跳转到另一个网页时,希望目标网页仍然在当前WebView中显示,而不是打开系统浏览器。
  • loadUrl():将网址传入,即可展示相应网页的内容

使用HTTP协议访问网络

HTTP协议的工作原理:客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理。

HttpURLConnection

早期Android上发送HTTP请求一般有两种方式:HttpURLConnection和HttpClient。
不过由于HttpClient存在API数量过多、扩展困难等缺点,Android团队越来越不建议使用这种方式。在Android 6.0系统中,HttpClient的功能被完全移除了,标志着此功能被正式弃用。

使用HttpURLConnection步骤如下:

  1. 获取HttpURLConnection的实例:
    new出一个URL对象,并传入目标的网络地址,然后调用一下openConnection() 方法
URL url = new URL("https://www.chenjianlink.cn");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  1. 设置HTTP请求所使用的方法:
    常用的方法主要有两个:GET 和POST 。GET表示希望从服务器那里获取数据,而POST则表示希望提交数据给服务器
connection.setRequestMethod("GET");

如果使用POST请求提交数据,在获取输入流之前把要提交的数据写出。注意每条数据都要以键值对的形式存在,数据与数据之间用“&”符号隔开

connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");
  1. 对HTTP请求的定制
    设置连接超时、读取超时的毫秒数,以及服务器希望得到的一些消息头等
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
  1. 获取到服务器返回的输入流
    调用getInputStream() 方法就可以获取到服务器返回的输入流,然后对输入流进行读取
InputStream in = connection.getInputStream();
  1. 关闭HTTP连接
    调用disconnect() 方法将这个HTTP连接关闭掉
connection.disconnect();

OkHttp

在开源盛行的今天,有许多出色的网络通信库都可以替代原生的HttpURLConnection,OkHttp无疑是做得最出色的一个。

使用OkHttp之前,需要先在项目中添加OkHttp库的依赖,在app/build.gradle文件,在dependencies闭包中添加如下内容

dependencies {...implementation 'com.squareup.okhttp3:okhttp:3.4.1'
}

OkHttp用法如下:

  1. 创建一个OkHttpClient的实例
OkHttpClient client = new OkHttpClient();
  1. 发起HTTP请求
    创建一个Request 对象:
Request request = new Request.Builder().build();

上述代码只是创建了一个空的Request对象,可以在最终的build() 方法之前连缀很多其他方法来丰富这个Request对象,例如使用url() 方法来设置目标的网络地址

如果是发送一个POST请求,需要先构建出一个RequestBody对象来存放待提交的参数,然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入

RequestBody requestBody = new FormBody.Builder().add("username", "admin").add("password", "123456").build();
Request request = new Request.Builder().url("https://www.chenjianlink.cn").post(requestBody).build();
  1. 发送请求
    调用OkHttpClient的newCall() 方法来创建一个Call对象,并调用它的execute() 方法来发送请求并获取服务器返回的数据
Response response = client.newCall(request).execute();

Response对象就是服务器返回的数据了,可以使用如下写法来得到返回的具体内容:

String responseData = response.body().string();

解析XML格式数据

一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。
解析XML格式的数据有两种方法:

  • Pull解析
  • SAX解析

Pull解析

使用Pull解析的步骤:

  1. 获取到一个XmlPullParserFactory的实例,并借助这个实例得到XmlPullParser对象。
  2. 调用XmlPullParser的setInput() 方法将服务器返回的XML数据设置进去就可以开始解析了。
  3. 通过getEventType()可以得到当前的解析事件,然后在一个while循环中不断地进行解析,如果当前的解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用next() 方法后可以获取下一个解析事件。

相关代码如下:

try {XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();xmlPullParser.setInput(new StringReader(xmlData));int eventType = xmlPullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {//getName()方法得到当前节点的名字String nodeName = xmlPullParser.getName();switch (eventType) {// 开始解析某个节点case XmlPullParser.START_TAG: {//相关逻辑if ("id".equals(nodeName)) {//nextText()方法来获取节点内具体的内容id = xmlPullParser.nextText();}break;}// 完成解析某个节点case XmlPullParser.END_TAG: {//相关逻辑break;}default:break;}eventType = xmlPullParser.next();}
} catch (Exception e) {e.printStackTrace();
}

SAX解析

SAX解析也是一种特别常用的XML解析方式,虽然它的用法比Pull解析要复杂一些,但在语义方面会更加清楚
新建一个类继承自DefaultHandler,并重写父类的5个方法:

public class MyHandler extends DefaultHandler {@Overridepublic void startDocument() throws SAXException {}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {}@Overridepublic void endDocument() throws SAXException {}
}
  • startDocument():在开始XML解析的时候调用
  • startElement():在开始解析某个节点的时候调用
  • characters():在获取节点中内容的时候调用
  • endElement():在完成解析某个节点的时候调用
  • endDocument():在完成整个XML解析的时候调用

新建MyHandler类之后要在代码中引用:

try {SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = factory.newSAXParser().getXMLReader();MyHandler handler = new MyHandler();// 将ContentHandler的实例设置到XMLReader中xmlReader.setContentHandler(handler);// 开始执行解析xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {e.printStackTrace();
}

创建一个SAXParserFactory的对象,然后再获取到XMLReader对象,接着将自定义的Handler的实例设置到XMLReader中,最后调
parse() 方法开始执行解析

解析JSON格式数据

比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观

使用JSONObject

使用JSONObject解析数据的步骤:

  1. 首先是将服务器返回的数据传入到了一个JSONArray对象中
  2. 然后循环遍历这个JSONArray,从中取出的每一个元素都是一个JSONObject对象,每个JSONObject对象中又会包含数据。
  3. 调用getString() 方法将这些数据取出

相关代码如下:

JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);String id = jsonObject.getString("id");···
}

使用GSON

要使用GSON,就必须要在项目中添加GSON库的依赖。编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

dependencies {...implementation 'com.google.code.gson:gson:2.7'
}

GSON主要就是可以将一段JSON格式的字符串自动映射成一个对象,从而不需要再手动去编写代码进行解析。

新建一个类,这个类中的字段与JSON中的字段一一对应。
调用如下代码就可以将JSON数据自动解析成一个对象:

Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);

如果需要解析的是一段JSON数组,需要借助TypeToken将期望解析成的数据类型传入到fromJson() 方法中

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());

网络编程实践

在获取到服务器响应的数据后,就可以对它进行解析和处理了。但是网络请求通常都是属于耗时操作,在调用网络请求方法时,若没有开启子线程去执行,会导致主线程阻塞,若开启子线程去执行网络请求,那么服务器响应的数据是无法进行返回的,所有的耗时逻辑都是在子线
程里进行的,会导致网络请求方法在服务器还没来得及响应的时候就执行结束了,当然也就无法返回响应的数据。

要解决上述问题,可以使用Java的回调机制,还可以使用OkHttp来实现

//OkHttp解决
public class HttpUtil {···public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).build();client.newCall(request).enqueue(callback);}
}HttpUtil.sendOkHttpRequest("http://www.baidu.com", new okhttp3.Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {// 得到服务器返回的具体内容String responseData = response.body().string();}@Overridepublic void onFailure(Call call, IOException e) {// 在这里对异常情况进行处理}});

Android学习羁绊之网络技术相关推荐

  1. Android学习羁绊之Activity

    原文链接:Android学习羁绊–>Activity Activity是Android系统的四大组件之一,Activity是用户可操作的可视化界面,为用户提供一个完成操作指令的窗口,一个Acti ...

  2. Android学习笔记-Wifi网络操作

    Wifi网卡状态 WIFI_STATE_DISABLED Wifi网卡不可用 WIFI_STATE_DIABLING Wifi网卡正在关闭 WIFI_STATE_ENABLED Wifi网卡可用 WI ...

  3. android学习日记15--WebView(网络视图)

    一.WebView 1.简述 WebView(网络视图)内置WebKit引擎,能加载显示网页,还支持JS,并且能够在Android平台使用AJAX WebView可以在布局中声明,也可以在Activi ...

  4. 《Android》Chap.11 网络技术

    WebView的用法 Android中的WebView控件可以实现在应用程序中嵌入一个浏览器,从而展示各种各样的网络 首先在activity_main.xml文件中加入WebView控件 <We ...

  5. Android学习羁绊之数据存储

    数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术 ...

  6. Android学习羁绊之Content Provider

    Content Provider(内容提供器)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.目前,使用内容提 ...

  7. Android学习羁绊之UI设计

    软件开发过程中,界面设计和功能开发同样重要.Android中有多种编写程序界面的方式可供选择.接下来学习一下Android的UI开发. 文章目录 常见UI控件 TextView Button Edit ...

  8. Android学习羁绊之Service

    Service(服务)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另 ...

  9. 计算机技术能力校本培训总结,计算机、网络技术校本培训总结.doc

    计算机.网络技术校本培训总结 一.指导思想: 我校自从2008年始就非常重视在教育教学中充分运用计算机多媒体教学的优势,发挥现代技术的创造力,在多年的实践中取得了显著成效.但是,计算机.网络的飞速发展 ...

最新文章

  1. SQLite主键自增需要设置为integer PRIMARY KEY
  2. Rsync+inotify搭建使用
  3. 怪物行为树案例_Behavior Designer行为树(简单实现巡逻)
  4. python观察日志(part19)--关于iPython中的In[]和Out[]
  5. 推动边缘计算的七项核心技术
  6. tomcat 启用NIO
  7. Linux下的PDF阅读器Foxit
  8. Luogu1156 垃圾陷阱
  9. 汇编语言 王爽 【第四版】实验一
  10. 路由器:斐讯K3C刷官改,固件版本是32.1.46.268
  11. Java程序员的MacBookPro(14寸M1)配置备忘录
  12. python print什么意思_python中print有什么用
  13. C#Assembly详解
  14. [三分]求凹凸函数最值
  15. 笔记本硬盘重装系统后只有一个盘的数据恢复方法
  16. 个税计算--Java
  17. Android Studio 与工具下载地址(谷歌、百度云、AndroidDevTools均可下载)
  18. 2015年最新苹果开发者账号注册流程详解
  19. gRPC详细入门教程,Golang/Python/PHP多语言讲解
  20. JAVA程序运行流程

热门文章

  1. 研究表情包做情感分析,最难辨认的情绪竟然是它!
  2. python给图片加滤镜的方程_纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)...
  3. Collection 集合的交集、差集和并集
  4. 粘滞键+脱机隐私声明破解win7开机密码
  5. window下安装Ubuntu双系统
  6. 影视后期,平面设计,ui设计师的必备网站
  7. SpringCloud升级之路2020.0.x版-13.UnderTow 核心配置
  8. iOS宝藏App,让你的iPhone好用数倍不止
  9. 全民一起玩Python提高篇第十四课:函数式编程初步(上)
  10. xtrabackup实现MySQL自动备份