【工具类】Retrofit网络库简单使用 & 封装(待执行)

300 阅读3分钟

一、基本使用

一、导包

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、简单使用

  1. 确定Base_url:最后统一末尾加个斜杠;
  2. 使用okhttp:retrofit2.0后需要使用okhtp;
  3. 增加Gson解析器;
  4. 得到Call对象 retrofit.create(NetWorkService::class.java) :新建一个对象,调用对应service中方法;
  • 同步call.execute();同步方法,外面需要包个协程;
  • 得到call.enqueue();自动 主->子->主(Callback);
  1. 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、打印回调数据

  1. onResponse中的call可以不用太关心,和我们想要的数据没啥关系;

image.png

  1. reponse对象:一些状态信息,包含protocol,请求码,message,url全链接
  • .body():返回json/其他格式,可以看到,reponse的状态是不是在body体里的,有公司喜欢json里面自定义状态;
  • 一般配合if (response.isSuccessful && response.body() != null) 使用

image.png

三、使用ViewModel与ProgressDialog优化

  • 比较简单,见提交记录feat:去除冗余代码,使用ViewModel与progressDialog

1、 生命周期感知

  1. kotlin 协程与生命周期感知型组件一起使用  |  Android 开发者  |  Android Developers
  • LifecycleScope在此范围内启动的协程会在 Lifecycle 被销毁时取消
  • 挂起生命周期感知型协程
//虽然viewModel里执行的是异步请求,外层使用lifecycleScope.launch感知生命周期
lifecycleScope.launch {
    viewModel.requestData()
}
  1. 实测这个ac销毁后协程自动取消,使用global不会自动取消

四、未完待续

补充知识

一、常规知识

1、 HTTP 方法:GET 对比 POST | 菜鸟教程 (runoob.com)

  • Post在安全性和保密性上做的更好,GET把请求的参数直接放在URL里,而POST把请求参数放在请求body里;

二、Retrofit

1、 Retrofit网络请求参数注解,@Path、@Query、@Post、Body等总结

  1. 分为网络请求方法,标记类,请求参数注解;三块位置不同,链接里的总结写的挺好的。

2、Cache、Cookie、Session、Token 傻傻分不清楚 - 腾讯云开发者社区-腾讯云 (tencent.com)

3、Android之网络—第二篇(Https原理) - 简书 (jianshu.com)

三、Okhttp相关

  1. 拦截器

Android Okhttp3 设置日志打印拦截器 - 好用

Android OKHttp 可能你从来没用过的拦截器 【实用推荐】 - 掘金 (juejin.cn)

  1. okhttp里可加addQueryParameter,使所有接口都带有相同参数,非常好用,所以设置UA登在这边配置很方便。

四、网络相关