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. 一起谈.NET技术,云计算和数据
  2. CentOS7下安装tomcat8
  3. 【学术相关】不喜欢做研究,到底要不要读博士?
  4. 深度学习(八)caffe源码学习-未完待续
  5. linux内核配置重置,linux内核配置--Boot options
  6. Apache IoTDB 物联网数据库引擎
  7. 6步学会VS封装DLL
  8. Matlab实现图像识别(十)
  9. Intel NUC10 i7FNH寒霜峡谷购机安装winesxi
  10. 众多尼龙VRay材质球素材一键即可获取
  11. 基于数据形式说明杜兰特的技术特点的分析(含Python实现讲解部分)
  12. 电脑连接蓝牙耳机后声音依旧外放的解决办法
  13. 计算机与音乐,计算机音乐与midi
  14. aoc s32p Android 内存,一机两用!AOC企鹅影霸 S32P显示器评测
  15. useCallback 的问题和隐患的解决方案 - 胡耀(字节跳动)
  16. 大数据存储基石——HDFS
  17. Android图像处理之Paint
  18. 对话依图医疗总裁倪浩:AI 产品只是第一步,未来要和医院制定中国儿童骨龄新标准...
  19. 输入一个正整数,求该数的阶乘。询问用户是否愿意继续。(使用嵌套循环实现) 【提示】: 1.N 的阶乘公式为:n! = 1 × 2 × … × (n - 1) × n 2.
  20. 复旦机器视觉与边缘计算-1.5人工智能与边缘计算-学习笔记

热门文章

  1. Oracle如何创建表空间
  2. 手机计算机错误改名字,电脑和手机qq怎么改名字?
  3. 基于采样的RRT/RRT*/RRT_connect算法笔记及C++实现
  4. 用.NET开发的磁力搜索引擎-crowh
  5. java常用开发框架
  6. mysql+pymysql_MySQL之pymysql
  7. Vue中使用luckyexcel插件开发在线表格编辑
  8. 微博短网址 php,php生成短网址 仿微博短网址生成代码
  9. php移动文件错误信息0,move_uploaded_file()移动文件失败
  10. 解决vscode报错:command-line error: language modes specified are incompatible C/C++(1027)