【Android】最好用的网络库:Retrofit

https://github.com/square/retrofit

Retrofit和OkHttp的定位完全不同:OkHttp 侧重的是底层通信的实现,而Retrofit 侧重的是上层接口的封装。

事实上,Retrofit 就是Square 公司在OkHttp 的基础上进一步开发出来的应用层网络通信库,使得我们可以用更加面向对象的思维进行网络操作。

Retrofit 的设计基于以下几个事实:

  • 同一款应用程序中所发起的网络请求绝大多数指向的是同一个服务器域名。
  • 另外,服务器提供的接口通常是可以根据功能来归类的。
  • 最后,开发者肯定更加习惯于"调用一个接口,获取它的返回值"这样的编码方式。

Retrofit 的用法就是基于以上几点来设计的:

  • 首先我们可以配置好一个根路径,然后在指定服务器接口地址时只需要使用相对路径即可,这样就不用每次都指定完整的URL地址了。

  • 另外,Retrofit 允许我们对服务器接口进行归类。

  • 最后,我们也完全不用关心网络通信的细节,只需要在接口文件中声明一系列方法和返回值, 然后通过注解的方式指定该方法对应哪个服务器接口,以及需要提供哪些参数。当我们在程序中调用该方法时,Retrofit 会自动向对应的服务器接口发起请求,并将响应的数据解析成返回值声明的类型 。这就使得我们可以用更加面向对象的思维来进行网络操作

kt 复制代码
interface AppService {
	//GET http://example.com/get_data.json
	@GET("get_data.json")
	fun getAppData(): Call<List<App>>

	//GET http://example.com/<page>/get_data.json
	@GET("{page}/get_data.json")
	fun getData(@Path("page") page: Int): Call<Data>

	//GET http://example.com/get_data.json?u=<user>&t=<token>
	@GET("get_data.json")
	fun getData(@Query("u") user: String, @Query("t") token: String): Call<Data>

	...
}
kt 复制代码
class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) { 
		super.onCreate(savedInstanceState) 
		setContentView(R.layout.activity_main) 
		getAppDataBtn.setOnClickListener {
			/**
			首先,使用了Retrofit.Builder来构建一个Retrofit 对象。注意:baseUrl() addConverterFactory() 两个方法都是必须调用的。
			*/
			val retrofit = Retrofit.Builder() 
			.baseUrl("http://10.0.2.2/") //baseUrl() 用于指定所有Retrofit 请求的根路径, 
			.addConverterFactory(GsonConverterFactory.create()) //addConverterFactory() 用于指定Retrofit 在解析数据时所使用的转换库,这里指定成 GsonConverterFactory。
			.build()
			
			/**
			调用create()方法,并传入具体Service接口所对应的Class类型,创建一个该接口的动态代理对象。
			*/
			val appService = retrofit.create(AppService::class.java)
			
			/**
			对应到上述的代码当中,当调用了AppService的getAppData()方法时,会返回一个 Call<List<App>>对象,再调用一下它的enqueue()方法,Retrofit 就会根据注解中配置的服务器接口地址去进行网络请求了,服务器响应的数据会回调到enqueue()方法中传入的Callback实现里面。
			需要注意的是,当发起请求的时候,Retrofit 会自动在内部开启子线程,当数据回调到Callback中之后,Retr ofit 又会自动切换回主线程,整个操作过程中我们都不用考虑线程切换问题。
			*/ 
			appService.getAppData().enqueue(object : Callback<List<App>> {
				override fun onResponse(call: Call<List<App>>, response: Response<List<App>>) {
					//在Callback的onResponse()方法中,调用response.body()方法将会得到Retrofit 解析后的对象,也就是List<App>类型的数据,最后遍历List,将其中的数据打印出来即可。
					val list = response.body()
					if (list != null) {
						for (app in list) {
							Log.d("MainActivity", "id is ${app.id}") 
							Log.d("MainActivity", "name is ${app.name}") 
							Log.d("MainActivity", "version is ${app.version}")
						} 
					}
				}
				override fun onFailure(call: Call<List<App>>, t: Throwable) {
					t.printStackTrace() 
				}
			}) 
		}
	} 
}
相关推荐
海天鹰4 小时前
PHP上传文件
android·开发语言·php
KaMeidebaby5 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法
上海云盾商务经理杨杨5 小时前
2026 生产级 Linux 内核抗 DDoS 调优!全套 sysctl 配置直接套用
网络·安全·ddos
2501_915918415 小时前
详解iOS App上架至App Store的全流程步骤与注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
rcms152702692185 小时前
CISCO 73-11029-01 印刷电路板
网络
韩楚风6 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
星恒讯工业路由器6 小时前
工业以太网核心技术解析
网络·物联网·网络拓扑·信息与通信·业以太网·网络冗余
云栖梦泽在6 小时前
稳如狗网络工具箱:IP、DNS、WebRTC、测速、连通性和全球延迟检测工具简明介绍
网络·网络协议·tcp/ip·网络安全·性能优化·webrtc
网络安全零基础教程6 小时前
网络安全春招面试避坑与复盘指南
linux·网络·安全·web安全·面试·职场和发展
码农coding6 小时前
android12 SystemUI之StatusBar(二)
android