本文介绍: 最后,我们也完全不用关心网络通信的细节,只需要在接口文件中声明一系列方法和返回值, 然后通过注解的方式指定该方法对应哪个服务器接口,以及需要提供哪些参数。事实上,Retrofit 就是Square 公司在OkHttp 的基础上进一步开发出来的应用层网络通信库,使得我们可以用更加面向对象的思维进行网络操作。Retrofit和OkHttp的定位完全不同:OkHttp 侧重的是底层通信的实现,而Retrofit 侧重的是上层接口的封装。另外,Retrofit 允许我们对服务器接口进行归类。
https://github.com/square/retrofit
Retrofit和OkHttp的定位完全不同:OkHttp 侧重的是底层通信的实现,而Retrofit 侧重的是上层接口的封装。
事实上,Retrofit 就是Square 公司在OkHttp 的基础上进一步开发出来的应用层网络通信库,使得我们可以用更加面向对象的思维进行网络操作。
-
首先我们可以配置好一个根路径,然后在指定服务器接口地址时只需要使用相对路径即可,这样就不用每次都指定完整的URL地址了。
-
最后,我们也完全不用关心网络通信的细节,只需要在接口文件中声明一系列方法和返回值, 然后通过注解的方式指定该方法对应哪个服务器接口,以及需要提供哪些参数。当我们在程序中调用该方法时,Retrofit 会自动向对应的服务器接口发起请求,并将响应的数据解析成返回值声明的类型。这就使得我们可以用更加面向对象的思维来进行网络操作。
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>
...
}
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()
}
})
}
}
}
原文地址:https://blog.csdn.net/m0_60641871/article/details/134734713
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_28562.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。