一、基本使用
- 样品工具库:kirikaTowa/AndroidUtils: Common tool library
- 分支:develop_network_origin
一、导包
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
二、简单使用
- 提交记录:Tag:Retrofit简单应用
1、确定目标链接
https://api.github.com/users/kirikaTowa
2、根据链接回调生成对应bean类
data class DataBean(
val avatar_url: String,
val bio: String,
val blog: String,
val company: Any,
val created_at: String,
val email: Any,
val events_url: String,
val followers: Int,
val followers_url: String,
val following: Int,
val following_url: String,
val gists_url: String,
val gravatar_id: String,
val hireable: Boolean,
val html_url: String,
val id: Int,
val location: String,
val login: String,
val name: String,
val node_id: String,
val organizations_url: String,
val public_gists: Int,
val public_repos: Int,
val received_events_url: String,
val repos_url: String,
val site_admin: Boolean,
val starred_url: String,
val subscriptions_url: String,
val twitter_username: Any,
val type: String,
val updated_at: String,
val url: String
)
3、 确定所绑定的接口方法类(官方内形参数名叫service)
- 使用Call<>对象 泛型包裹,返回可以调用Call的方法
interface NetWorkService {
@get:GET("users/kirikaTowa")
val getDataBean: Call<DataBean?>?
}
4、简单使用
- 确定Base_url:最后统一末尾加个斜杠;
- 使用okhttp:retrofit2.0后需要使用okhtp;
- 增加Gson解析器;
- 得到Call对象 retrofit.create(NetWorkService::class.java) :新建一个对象,调用对应service中方法;
- 同步call.execute();同步方法,外面需要包个协程;
- 得到call.enqueue();自动 主->子->主(Callback);
- PS:rxjava-Observable、Flowable等类型;
val BASE_URL = "https://api.github.com/"
val client = OkHttpClient()
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
val callRetro = retrofit.create(NetWorkService::class.java)
callRetro.getDataBean?.enqueue(object : Callback<DataBean?> {
override fun onResponse(call: Call<DataBean?>, response: Response<DataBean?>) {
Log.d("yeTest", "call: "+call)
Log.d("yeTest", "onResponse: "+response)
Log.d("yeTest", "onResponse body: "+response.body())
}
override fun onFailure(call: Call<DataBean?>, t: Throwable) {
Log.d("yeTest", "onFailure: ")
}
})
5、打印回调数据
- onResponse中的call可以不用太关心,和我们想要的数据没啥关系;
- reponse对象:一些状态信息,包含protocol,请求码,message,url全链接;
- .body():返回json/其他格式,可以看到,reponse的状态是不是在body体里的,有公司喜欢json里面自定义状态;
- 一般配合
if (response.isSuccessful && response.body() != null)使用
三、使用ViewModel与ProgressDialog优化
- 比较简单,见提交记录
feat:去除冗余代码,使用ViewModel与progressDialog
1、 生命周期感知
- LifecycleScope在此范围内启动的协程会在
Lifecycle被销毁时取消 - 挂起生命周期感知型协程
//虽然viewModel里执行的是异步请求,外层使用lifecycleScope.launch感知生命周期
lifecycleScope.launch {
viewModel.requestData()
}
- 实测这个ac销毁后协程自动取消,使用global不会自动取消
四、未完待续
补充知识
一、常规知识
1、 HTTP 方法:GET 对比 POST | 菜鸟教程 (runoob.com)
- Post在安全性和保密性上做的更好,GET把请求的参数直接放在URL里,而POST把请求参数放在请求body里;
二、Retrofit
1、 Retrofit网络请求参数注解,@Path、@Query、@Post、Body等总结
- 分为网络请求方法,标记类,请求参数注解;三块位置不同,链接里的总结写的挺好的。
2、Cache、Cookie、Session、Token 傻傻分不清楚 - 腾讯云开发者社区-腾讯云 (tencent.com)
3、Android之网络—第二篇(Https原理) - 简书 (jianshu.com)
三、Okhttp相关
- 拦截器
Android Okhttp3 设置日志打印拦截器 - 好用
Android OKHttp 可能你从来没用过的拦截器 【实用推荐】 - 掘金 (juejin.cn)
- okhttp里可加addQueryParameter,使所有接口都带有相同参数,非常好用,所以设置UA登在这边配置很方便。