Android网络相关(更新中)

70 阅读2分钟

前言

在Android应用的使用中,总是存在不可避免的上传/获取数据的场景,所以学习Android网络通信相关的技术还是很有必要的。本文主要总结了HttpURLConnectionokhttp以及Retrofit三个常用网络请求工具的基本使用,以及JSON解析工具gson


网络请求

先来复习一下(最为简单的)网络请求模型

sequenceDiagram
Client->>Server: 发送请求
Server-->>Server: 处理请求
Server-->>Client: 返回数据
Client->>Client: 处理数据

此处去除了较多细节,如:在发送请求前的确认连接等等。因为在入门时较少关注这块内容,所以在此不表


HttURLConnection

对于发送HTTP请求,Android原生SDK提供HttpURLConnection这一工具以满足需求。

HttpURLConnection 支持系统级连接池,并且在系统层面做了缓存策略处理,可以加快重复请求的速度。

这里先简单介绍HttURLConnection的使用方法

请求之前

在Android中,应用访问网络需要申请android.permission.INTERNET权限。因为该权限为安装时权限,所以在编写网络请求之前,只需在AbdriudManifest.xml内声明即可。

<manifest xmlns:android="schemas.android.com/apk/res/android"
          package="xxxxxxx">
    <uses-permission android:name="android.permission.INTERNET">
    ... 
</manifest>

发送请求

在发送请求前,我们需要创建一个请求。也就是创建HttpURLConnection实例

只需要使用urlObject.openConnection()方法即可获取。接下来就可以使用该对象设置HTTP请求的相应细节(例如请求方法,连接超时等)

val url = URL("http://xxxxxxxxx")
val connection = url.openConnection() as HttpURLConnection
connection.apply {
    requestMethod = "GET"
    connectTimeout = 8000
    readTimeout = 8000
}

返回数据

对于服务器返回的HTTP数据,我们使用connectionObject.getInputStream()获取输入流并读取。在读取完成后,再调用connectionObject.close()关闭连接

 val response = StringBuilder()
 //输入流
 val input = connection.inputStream
 val reader = BufferedReader(InputStreamReader(input))
 reader.use {
     reader.forEachLine{
         response.append(it)
     }
 }
 connection.close()

POST请求

与上方演示的GET请求不同,POST请求需要提交数据。我们可以手动获取对应请求的输出流connectionObject.outputStream,并将数据写入当中

connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("xxxxxxxxxx")