Android网络技术

WebView的用法

当我们在Android应用中需要加载一个网页,但是需要却要求不能打开浏览器。这个需求怎么实现呢,这就需要用到了WebView了,我们还是通过代码来认识一下,首先创建一个WebViewTest项目,首先修改activity_main.xml中的代码
先添加一个WebViwe并设置ID
image
然后修改MainActivity中的代码:
image
在AndroidMainfest里面添加网络权限
image
然后运行项目,发现打开了百度页面

Http访问网络

我们手动分析Http的请求方式。

使用HttpURLConnection

在Android6.0之后建议我们使用HttpURIConnection发送Http请求,
步骤:首先要获取HttpURIConnection实例,先创建一个URI,并传入网络地址, 然后调用openConnection即可
val url = URL("https://www.baidu.com") val connrction = url.openConnection() as HttpURLConnection
拿到HttpURLConnecion实例之后,我们可以设置一下Http请求所使用的方法,常用的GET,POST
connection.requestMethod = "GET"
还有一些自由定制,比如设置连接超时,读取超时毫秒数,以及服务器希望的到的一些消息等
conncetion.connectTimeout = 8000 connection.readTimieout = 8000
之后调用getInputStream()方法就可以获取到服务器返回的输入流,剩下的任务就是对输入流进行读取
val input = connnection.inputStream
最后调用disconect(),将流关闭
connectionl.disconnect()

我们同时实例来实践一下,创建NetwoekTest项目:
修改activity_mian.xml布局
image
然后修改MainActivity中的代码:
image

运行项目,点击之后。我们可以到网络请过来,收到了百度页面的代码

当然我们出了可以接受数据之外,还可以发送数据,只需要将HTTP的请求方法改成Post,并在获取输入流的之前要把提交的数据写出即可。每条数据都要以键值对的形式存在,数据与数据之间用&符号隔开。比如说我们想要向服务器提交用户名和密码,代码如下
connection.requestMethod = "PSOT" val output = DataOutputStream(connection.outputStream) ouput.writeBytes("usename = admin & password=123456")

使用OkHttp

OkHttp是一个目前Android开发者首选的网络通信库,
官方网址如下https://square.github.io/okhttp/
我们来学习一下OKHttp,首先需要引入OKHttp的依赖,
我么这里导入的OkHttp4.1的依赖
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
接下来首先需要创建一个OkHttpClient的实例,如下所示。
val client = OkHttpClient()
接下来如果想要发起一条Http请求,需要创建一个Request对象,我们可以在request对象里面添加连缀来丰富这个Request对象,url设置目标地址,
image
之后调用OkHttpClient的newCall方法创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
val response = client.newCall(request).execute()
response对象就是服务器返回的数据,可以通过下面的写法获得具体的返回内容
val responseData = response.body?.string()
如果是发起一条post请求,我们需要先构建一个RequestBody对象来存放待提交的参数,
image
然后需要在Request.Builder中调用一个post方法,并将RequestBody对象传入。
image

我们下面来实操一下,在NewworkTest这个项目改用OKHttp的方式在实现一遍,布局不动,只修改MinaActivity中的内容:
image

解析XML格式数据

首先我们要探究解析数据,需要在本地搭建我们自己的服务器,我们就以Apache为例,
首先我们搭建Apache环境,
https://www.cnblogs.com/wcwnina/p/8044353.html
完成搭建之后我们开始探究

Pull解析方式

我们首先在该文件下放置一份xml数据
image
数据内容如下
image
Pull解析方式,是用于解析xml代码的,我们首先来看代码:
image
image

由于在Android9.0之后系统默认支持HTTPS,所以我们需要进行一个配置
在res,下新建目录xml,在里面建立如下文件,该文件配置允许我们在网络上明文传输数据
image
最后我们在AndroidMainfest里面配置
image
最后运行起来,查看数据被解析出来了:
image

SAX解析方式

SAX解析也是一种常用的XML解析方式,比PUll解析要复杂一些,但是在语义方面相对更加清楚。
image
我们还在原来的基础上修改代码:新建一个ContentHandler类,继承DefaultHandler
image
image
MianActivity中的代码如下:
image

解析JSON格式数据

JSON相比于XML,JSON的主要优势在于体积小,传输省流量。缺点的话就是语义性比较差
我们首先准备一份数据
image

使用JSONObject

解析JSON有很多中方法,可以使用官方提供JSONObject,也可以使用Google开源库GSON。另外,一些第三方开源库Jackson,FastJSON等也非常不错
我们来实践一下JSONObject,
image
image
我们运行之后发现输出数据:
image

使用GSON

Google为我们提供了一个更加简答的解析数据的装置,GSON。可以将JSON对象自动解析成字符串的格式
首先我们看一下步骤:首先我们需要添加一个依赖
implementation 'com.google.code.gson:gson:2.8.5'
然后创建一个APP类,写入id,name,version字段
image
然后修改MainActivity中的代码:
image
image
然后查看日志打印:
image

网络请求最好回调方式

在上面我们写网络的接受和发送请求的时候,我们可以抽象一个工具类,用作去请求和发送。我们看一下下面的代码:
image

当我们需要发起一条Http请求的时候,可以写成下面的格式
val address = "http://www.baidu.com" val response = HttpUtil.sendHttpRequest(address)
在获取服务器响应数据后,我们可以对他进行解析和处理。因为网络请求属于耗时操作,sendHttpRequest方法内部并没有开启线程,这样在调用sendHttpRqeust方法的时候主线程可能被阻塞,但是当我们开启子线程之后又会面临数据无法返回的问题。

这是我们就需要回调机制来解决问题了,
首先定义一个接口,命名为HttpCallbackListener,代码如下
image

然后修改HttpUtil中的代码:给sendHttpRequest方法添加了一个HttpCallbackListener参数,并在方法内部开启了一个子线程。
然后再子线程里面执行了具体的网络操作
image

我们现在调用代码的形式如下:

点击查看代码
HttpUtil.sendRequest(address,onject:HttpCallbackListener) {
	override fun onFinish(response: String) {
		//得到服务器返回的具体内容
	}
	overrode fun onError(e: Exception) {
		//在这里进行异常情况的处理
		
	}
}
这样当服务器成功响应的时候,我们就可以在onFinish()方法里对影响数据进行处理了,类似地,如果出现了异常,就可以在onError方法里对异常情况进行处理了。

我们HttpUtil处理逻辑改成OKHttp,
image

在调用sendOKHttpRequest()方法就可以这样写
HttpUtill.sendOkHttpRequesst(address,object: Callback) {
override fun onResponse(cal: Call,response: Response) {
//得到服务器返回的具体内容
val responseData = response.body?.string
}

override fun onFailure(cal: Call,e:IOException) {
//在这里对异常情况进行处理
}

}

最好用的网络库 Retrofit

Retrofit是一款由Square公司开发的网络库,但是它和OkHttp的定位完全不同,OKHttp侧重底层通信,Retrefit侧重的是上层封装。
特点:

Retrofit的基本用法

我们新建一个RetrofitTest项目,首先我们需要添加Retrofit依赖,Retrofit是基于OkHtpp开发,所会也会引入相关版本的OkHttp
image
我们创建一个App类
image
定义一个接口文件,AppService
image

然后再anctivity_main中添加一个按钮:
image

然后再看MainActivity中代码:
image
在AndroidMainfest.xml中添加权限:
image
运行项目,数据被拿出来了
image

处理复杂的接口类型

实际开发环境中,我们可能会出现需要该变多中Uri地址,需要变动,这就需要我们会自己拼接动态地址了。
当我们需要请求
GET http://example.com/<page>/get_data.json

在这个接口中我们可以这样写
image

当我们传入多个参数的时候,当我们传入多个参数
GET http://example.com/get_data.json?u=<user>&t=<token>
image

变换类型的请求地址,这个接口的意思就是根据id删除一条指定的数据
DELETE http://example.com/data/<id>
image

向服务器提交数据
POST htttp://example.com/data/create {"id":1,"content":"The description for this data"}
image
指定Header参数,
GET http://example.com/get_data.json User-Agent:okhttp Cache-Control:max-age=0
header参数其实就是一个个键值对,
image
下面是动态指定:
image

Retrofit构建器的最佳写法

我们在获取Service接口的动态代理对象比较麻烦,每次都需要写。这其实我们也可以写成一个工具类。
我们新建一个ServiceCreator单例类:
image
当我们外部调用这个方法只需要
val appService = ServiceCreator.create(AppService::class.java)

posted @   IT小五  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示